From 7cc7319a8aaeafb185f6d5e7d50d8142c34e1a4c Mon Sep 17 00:00:00 2001
From: Ameya Shenoy
Date: Tue, 7 Aug 2018 14:39:39 +0530
Subject: [PATCH 01/56] DocType name should not have hyphens in it (#5934)
---
frappe/core/doctype/doctype/doctype.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py
index b82b012e23..c6ffba94ae 100644
--- a/frappe/core/doctype/doctype/doctype.py
+++ b/frappe/core/doctype/doctype/doctype.py
@@ -396,9 +396,9 @@ class DocType(Document):
# a DocType's name should not start with a number or underscore
# and should only contain letters, numbers and underscore
if six.PY2:
- is_a_valid_name = re.match("^(?![\W])[^\d_\s][\w -]+$", name)
+ is_a_valid_name = re.match("^(?![\W])[^\d_\s][\w ]+$", name)
else:
- is_a_valid_name = re.match("^(?![\W])[^\d_\s][\w -]+$", name, flags = re.ASCII)
+ is_a_valid_name = re.match("^(?![\W])[^\d_\s][\w ]+$", name, flags = re.ASCII)
if not is_a_valid_name:
frappe.throw(_("DocType's name should start with a letter and it can only consist of letters, numbers, spaces and underscores"), frappe.NameError)
From 62a7214a9b25ae7e90f76a1096d8b67b064ac013 Mon Sep 17 00:00:00 2001
From: Shreya Shah
Date: Tue, 7 Aug 2018 14:43:32 +0530
Subject: [PATCH 02/56] Check if fieldname is present in row else continue
(#5912)
---
frappe/email/doctype/auto_email_report/auto_email_report.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.py b/frappe/email/doctype/auto_email_report/auto_email_report.py
index 01b8566982..4942d98375 100644
--- a/frappe/email/doctype/auto_email_report/auto_email_report.py
+++ b/frappe/email/doctype/auto_email_report/auto_email_report.py
@@ -108,6 +108,7 @@ class AutoEmailReport(Document):
new_row = []
out.append(new_row)
for df in columns:
+ if not row.get(df.fieldname): continue
new_row.append(frappe.format(row[df.fieldname], df, row))
return out
From 0f68fec03e1fea923f57fbb08b8ad6f5d30a345e Mon Sep 17 00:00:00 2001
From: "FinByz Tech Pvt. Ltd"
Date: Tue, 7 Aug 2018 14:45:36 +0530
Subject: [PATCH 03/56] Added outgoing sender in email alert (#5892)
* Added outgoing sender in email alert
* Added semicolon
* Minor fix
---
.../email/doctype/email_alert/email_alert.js | 10 +++
.../doctype/email_alert/email_alert.json | 64 ++++++++++++++++++-
.../email/doctype/email_alert/email_alert.py | 7 ++
3 files changed, 80 insertions(+), 1 deletion(-)
diff --git a/frappe/email/doctype/email_alert/email_alert.js b/frappe/email/doctype/email_alert/email_alert.js
index 3f7423bc1b..a901b257cb 100755
--- a/frappe/email/doctype/email_alert/email_alert.js
+++ b/frappe/email/doctype/email_alert/email_alert.js
@@ -1,3 +1,13 @@
+this.frm.add_fetch('sender', 'email_id', 'sender_email');
+
+this.frm.fields_dict.sender.get_query = function(){
+ return {
+ filters: {
+ 'enable_outgoing': 1
+ }
+ }
+};
+
frappe.email_alert = {
setup_fieldname_select: function(frm) {
// get the doctype to update fields
diff --git a/frappe/email/doctype/email_alert/email_alert.json b/frappe/email/doctype/email_alert/email_alert.json
index fd3763cd14..860bfbd46d 100755
--- a/frappe/email/doctype/email_alert/email_alert.json
+++ b/frappe/email/doctype/email_alert/email_alert.json
@@ -379,6 +379,68 @@
"set_only_once": 0,
"unique": 0
},
+ {
+ "allow_bulk_edit": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "sender",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Sender",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Email Account",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "sender_email",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Sender Email",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Email",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 1,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
@@ -871,7 +933,7 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2017-09-26 20:10:00.061780",
+ "modified": "2018-07-30 14:32:02.179599",
"modified_by": "Administrator",
"module": "Email",
"name": "Email Alert",
diff --git a/frappe/email/doctype/email_alert/email_alert.py b/frappe/email/doctype/email_alert/email_alert.py
index cfd081d7ae..ac0ef21536 100755
--- a/frappe/email/doctype/email_alert/email_alert.py
+++ b/frappe/email/doctype/email_alert/email_alert.py
@@ -105,6 +105,7 @@ def get_context(context):
def send(self, doc):
'''Build recipients and send email alert'''
+ from email.utils import formataddr
def get_attachment(doc):
""" check print settings are attach the pdf """
@@ -126,6 +127,7 @@ def get_context(context):
context = get_context(doc)
recipients = []
+ sender = ""
for recipient in self.recipients:
if recipient.condition:
@@ -157,6 +159,10 @@ def get_context(context):
context = {"doc": doc, "alert": self, "comments": None}
+ if self.sender:
+ sender = formataddr((self.sender, self.sender_email))
+ frappe.errprint(sender)
+
if self.is_standard:
self.load_standard_properties(context)
@@ -170,6 +176,7 @@ def get_context(context):
frappe.sendmail(recipients=recipients, subject=subject,
message= frappe.render_template(self.message, context),
+ sender = sender,
reference_doctype = doc.doctype,
reference_name = doc.name,
attachments = attachments,
From 71efb0e8e6e9157dc416619d486adbe92817fe8c Mon Sep 17 00:00:00 2001
From: Ameya Shenoy
Date: Tue, 7 Aug 2018 13:02:10 +0000
Subject: [PATCH 04/56] [fix] scrub options of whitespace
---
frappe/core/doctype/doctype/doctype.py | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py
index b82b012e23..ac603460fc 100644
--- a/frappe/core/doctype/doctype/doctype.py
+++ b/frappe/core/doctype/doctype/doctype.py
@@ -55,6 +55,7 @@ class DocType(Document):
self.permissions = []
self.scrub_field_names()
+ self.scrub_options_in_select()
self.set_default_in_list_view()
self.validate_series()
self.validate_document_type()
@@ -177,6 +178,17 @@ class DocType(Document):
# fieldnames should be lowercase
d.fieldname = d.fieldname.lower()
+ def scrub_options_in_select(self):
+ """Strip options for whitespaces"""
+ for field in self.fields:
+ if field.fieldtype == "Select" and field.options is not None:
+ new_options = ""
+ for option in field.options.split("\n"):
+ new_options += option.strip()
+ new_options += "\n"
+ new_options.rstrip("\n")
+ field.options = new_options
+
def validate_series(self, autoname=None, name=None):
"""Validate if `autoname` property is correctly set."""
if not autoname: autoname = self.autoname
From 54238c7e4c7aceb642ad117561c3dffcf5fabdf8 Mon Sep 17 00:00:00 2001
From: Shreya Shah
Date: Mon, 13 Aug 2018 10:30:21 +0530
Subject: [PATCH 05/56] Fix comment mentions again (#5945)
* Fix comment mentions again
* Improvise as per suggestion
* Show mentions based on emails instead of names
---
frappe/core/doctype/communication/comment.py | 2 +-
frappe/core/doctype/user/user.py | 2 +-
frappe/public/js/frappe/form/footer/timeline.js | 17 ++++++++++++-----
3 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/frappe/core/doctype/communication/comment.py b/frappe/core/doctype/communication/comment.py
index 2c7a4bd122..0ceb93219c 100644
--- a/frappe/core/doctype/communication/comment.py
+++ b/frappe/core/doctype/communication/comment.py
@@ -94,7 +94,7 @@ def notify_mentions(doc):
subject = _("{0} mentioned you in a comment").format(sender_fullname)
- recipients = [frappe.db.get_value("User", {"enabled": 1, "name": name, "user_type": "System User"})
+ recipients = [frappe.db.get_value("User", {"enabled": 1, "name": name, "user_type": "System User"}, "email")
for name in mentions]
frappe.sendmail(
recipients=recipients,
diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py
index cb85399fb9..c4378dbb8c 100644
--- a/frappe/core/doctype/user/user.py
+++ b/frappe/core/doctype/user/user.py
@@ -901,10 +901,10 @@ def notify_admin_access_to_system_manager(login_manager=None):
def extract_mentions(txt):
"""Find all instances of @name in the string.
The mentions will be separated by non-word characters or may appear at the start of the string"""
+ txt = txt.replace("
", "
")
txt = re.sub(r'(<[a-zA-Z\/][^>]*>)', '', txt)
return re.findall(r'(?:[^\w\.\-\@]|^)@([\w\.\-\@]*)', txt)
-
def handle_password_test_fail(result):
suggestions = result['feedback']['suggestions'][0] if result['feedback']['suggestions'] else ''
warning = result['feedback']['warning'] if 'warning' in result['feedback'] else ''
diff --git a/frappe/public/js/frappe/form/footer/timeline.js b/frappe/public/js/frappe/form/footer/timeline.js
index 7c760b80a3..d93a9ae804 100644
--- a/frappe/public/js/frappe/form/footer/timeline.js
+++ b/frappe/public/js/frappe/form/footer/timeline.js
@@ -118,7 +118,6 @@ frappe.ui.form.Timeline = Class.extend({
this.wrapper.toggle(true);
this.list.empty();
this.comment_area.val('');
-
var communications = this.get_communications(true);
communications
@@ -178,7 +177,6 @@ frappe.ui.form.Timeline = Class.extend({
} else {
var $edit_btn = $(this);
var content = $timeline_item.find('.timeline-item-content').html();
-
$edit_btn
.text("Save")
.find('i')
@@ -298,7 +296,6 @@ frappe.ui.form.Timeline = Class.extend({
c.original_content = c.content;
c.content = frappe.utils.toggle_blockquote(c.content);
}
-
if(!frappe.utils.is_html(c.content)) {
c.content_html = frappe.markdown(__(c.content));
} else {
@@ -312,7 +309,17 @@ frappe.ui.form.Timeline = Class.extend({
// avoid adding tag a 2nd time
!c.content_html.match(/(^|\W)(@[^\s]+)<\/b>/)
) {
- c.content_html = c.content_html.replace(/(^|\W)(@[^\s]+)/g, "$1$2");
+ /*
+ Replace the email ids by only displaying the string which
+ occurs before the second `@` to enhance the mentions.
+ Eg.
+ @abc@a-example.com will be converted to
+ @abc with the below line of code.
+ */
+
+ c.content_html = c.content_html.replace(/(<[a][^>]*>)/g, "");
+ // bold the @mentions
+ c.content_html = c.content_html.replace(/(@[^\s@]*)@[^\s@|<]*/g, "$1");
}
if (this.is_communication_or_comment(c)) {
@@ -657,7 +664,7 @@ frappe.ui.form.Timeline = Class.extend({
var valid_users = Object.keys(frappe.boot.user_info)
.filter(user => !["Administrator", "Guest"].includes(user));
- return valid_users.map(user => frappe.boot.user_info[user].name);
+ return valid_users.map(user => frappe.boot.user_info[user].email);
},
setup_comment_like: function() {
From 4504bc1ebca13cd342604e489298bb28232b16cc Mon Sep 17 00:00:00 2001
From: Ameya Shenoy
Date: Mon, 20 Aug 2018 13:08:40 +0530
Subject: [PATCH 06/56] [feature] print multiple docs from multiple doctypes
---
frappe/utils/print_format.py | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/frappe/utils/print_format.py b/frappe/utils/print_format.py
index 652b8804ab..2b555a03d8 100644
--- a/frappe/utils/print_format.py
+++ b/frappe/utils/print_format.py
@@ -20,14 +20,21 @@ def download_multi_pdf(doctype, name, format=None):
# name can include names of many docs of the same doctype.
import json
- result = json.loads(name)
-
- # Concatenating pdf files
output = PdfFileWriter()
- for i, ss in enumerate(result):
- output = frappe.get_print(doctype, ss, format, as_pdf = True, output = output)
- frappe.local.response.filename = "{doctype}.pdf".format(doctype=doctype.replace(" ", "-").replace("/", "-"))
+ if not isinstance(doctype, dict):
+ result = json.loads(name)
+
+ # Concatenating pdf files
+ for _, ss in enumerate(result):
+ output = frappe.get_print(doctype, ss, format, as_pdf = True, output = output)
+ frappe.local.response.filename = "{doctype}.pdf".format(doctype=doctype.replace(" ", "-").replace("/", "-"))
+ else:
+ for doctype_name in doctype:
+ for doc_name in doctype[doctype_name]:
+ output = frappe.get_print(doctype_name, doc_name, format, as_pdf = True, output = output)
+ frappe.local.response.filename = "{}.pdf".format(frappe.session.user.replace('@', '-'))
+
frappe.local.response.filecontent = read_multi_pdf(output)
frappe.local.response.type = "download"
From 65e96ff7a4a90b6440a6476fe946d08a75677f8e Mon Sep 17 00:00:00 2001
From: Ameya Shenoy
Date: Tue, 21 Aug 2018 14:59:47 +0530
Subject: [PATCH 07/56] added docstring to download multi pdf
- also made the PDF name as a parameter which is passed by the user
---
frappe/utils/print_format.py | 41 ++++++++++++++++++++++++++++++++++--
1 file changed, 39 insertions(+), 2 deletions(-)
diff --git a/frappe/utils/print_format.py b/frappe/utils/print_format.py
index 2b555a03d8..563508923b 100644
--- a/frappe/utils/print_format.py
+++ b/frappe/utils/print_format.py
@@ -17,7 +17,44 @@ standard_format = "templates/print_formats/standard.html"
@frappe.whitelist()
def download_multi_pdf(doctype, name, format=None):
- # name can include names of many docs of the same doctype.
+ """
+ Concatenate multiple docs as PDF .
+
+ Returns a PDF compiled by concatenating multiple documents. The documents
+ can be from a single DocType or multiple DocTypes
+
+ Note: The design may seem a little weird, but it exists exists to
+ ensure backward compatibility. The correct way to use this function is to
+ pass a dict to doctype as described below
+
+ NEW FUNCTIONALITY
+ =================
+ Parameters:
+ doctype (dict):
+ key (string): DocType name
+ value (list): of strings of doc names which need to be concatenated and printed
+ name (string):
+ name of the pdf which is generated
+ format:
+ Print Format to be used
+
+ Returns:
+ PDF: A PDF generated by the concatenation of the mentioned input docs
+
+ OLD FUNCTIONALITY - soon to be deprecated
+ =========================================
+ Parameters:
+ doctype (string):
+ name of the DocType to which the docs belong which need to be printed
+ name (string or list):
+ If string the name of the doc which needs to be printed
+ If list the list of strings of doc names which needs to be printed
+ format:
+ Print Format to be used
+
+ Returns:
+ PDF: A PDF generated by the concatenation of the mentioned input docs
+ """
import json
output = PdfFileWriter()
@@ -33,7 +70,7 @@ def download_multi_pdf(doctype, name, format=None):
for doctype_name in doctype:
for doc_name in doctype[doctype_name]:
output = frappe.get_print(doctype_name, doc_name, format, as_pdf = True, output = output)
- frappe.local.response.filename = "{}.pdf".format(frappe.session.user.replace('@', '-'))
+ frappe.local.response.filename = "{}.pdf".format(name)
frappe.local.response.filecontent = read_multi_pdf(output)
frappe.local.response.type = "download"
From e166817c3c9465b91d00f0c6b28ea2419ae7c8d5 Mon Sep 17 00:00:00 2001
From: Benji
Date: Wed, 22 Aug 2018 13:28:34 +0800
Subject: [PATCH 08/56] minor bugfix python 3 (#5997)
bugfix
---
frappe/utils/password_strength.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frappe/utils/password_strength.py b/frappe/utils/password_strength.py
index 2e781897ad..203a24cae1 100644
--- a/frappe/utils/password_strength.py
+++ b/frappe/utils/password_strength.py
@@ -110,7 +110,7 @@ def get_match_feedback(match, is_sole_match):
_("Try to avoid repeated words and characters")
],
}
- if len(match.get("repeated_char")) == 1:
+ if match.get("repeated_char") and len(match.get("repeated_char")) == 1:
feedback = {
"warning": _('Repeats like "aaa" are easy to guess'),
"suggestions": [
From 89a8073c1f8ea8d48fc6dd577e79c63ff9ba1172 Mon Sep 17 00:00:00 2001
From: Ameya Shenoy
Date: Wed, 22 Aug 2018 11:00:26 +0530
Subject: [PATCH 09/56] [fix] the patch needs to be executed before reloading
moduledef (#5996)
---
frappe/patches.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frappe/patches.txt b/frappe/patches.txt
index 3c8884b52b..ca22f99fbe 100644
--- a/frappe/patches.txt
+++ b/frappe/patches.txt
@@ -8,13 +8,13 @@ frappe.patches.v7_2.remove_in_filter
execute:frappe.reload_doc('core', 'doctype', 'doctype', force=True) #2017-09-22
execute:frappe.reload_doc('core', 'doctype', 'docfield', force=True) #2017-03-03
execute:frappe.reload_doc('core', 'doctype', 'docperm') #2017-03-03
+frappe.patches.v8_0.drop_is_custom_from_docperm
execute:frappe.reload_doc('core', 'doctype', 'module_def') #2017-09-22
execute:frappe.reload_doc('core', 'doctype', 'version') #2017-04-01
execute:frappe.reload_doc('core', 'doctype', 'activity_log')
frappe.patches.v7_1.rename_scheduler_log_to_error_log
frappe.patches.v6_1.rename_file_data
frappe.patches.v7_0.re_route #2016-06-27
-frappe.patches.v8_0.drop_is_custom_from_docperm
frappe.patches.v8_0.update_records_in_global_search #11-05-2017
frappe.patches.v8_0.update_published_in_global_search
execute:frappe.reload_doc('core', 'doctype', 'custom_docperm')
From 0285b8fb188021aaf23ff5dc47100d0d9e7d640a Mon Sep 17 00:00:00 2001
From: Prateeksha Singh
Date: Wed, 22 Aug 2018 11:00:36 +0530
Subject: [PATCH 10/56] [migration-run] don't validate errored runs,
postprocess on error too (#5998)
---
.../data_migration_run/data_migration_run.py | 19 +++++++------------
1 file changed, 7 insertions(+), 12 deletions(-)
diff --git a/frappe/data_migration/doctype/data_migration_run/data_migration_run.py b/frappe/data_migration/doctype/data_migration_run/data_migration_run.py
index cd446d2a56..55e7dbe818 100644
--- a/frappe/data_migration/doctype/data_migration_run/data_migration_run.py
+++ b/frappe/data_migration/doctype/data_migration_run/data_migration_run.py
@@ -9,15 +9,6 @@ from frappe import _
from frappe.utils import get_source_value
class DataMigrationRun(Document):
-
- def validate(self):
- exists = frappe.db.exists('Data Migration Run', dict(
- status=('in', ['Fail', 'Error']),
- name=('!=', self.name)
- ))
- if exists:
- frappe.throw(_('There are failed runs with the same Data Migration Plan'))
-
def run(self):
self.begin()
if self.total_pages > 0:
@@ -78,6 +69,7 @@ class DataMigrationRun(Document):
self.db_set('status', 'Error', notify=True, commit=True)
print('Data Migration Run failed')
print(frappe.get_traceback())
+ self.execute_postprocess('Error')
raise e
def get_last_modified_condition(self):
@@ -132,6 +124,12 @@ class DataMigrationRun(Document):
self.db_set(fields, notify=True, commit=True)
+ self.execute_postprocess(status)
+
+ frappe.publish_realtime(self.trigger_name,
+ {"progress_percent": 100}, user=frappe.session.user)
+
+ def execute_postprocess(self, status):
# Execute post process
postprocess_method_path = self.get_plan().postprocess_method
@@ -147,9 +145,6 @@ class DataMigrationRun(Document):
}
})
- frappe.publish_realtime(self.trigger_name,
- {"progress_percent": 100}, user=frappe.session.user)
-
def get_plan(self):
if not hasattr(self, 'plan'):
self.plan = frappe.get_doc('Data Migration Plan', self.data_migration_plan)
From aee86f7bc08f9faefa9466f374319bb8f6ed9581 Mon Sep 17 00:00:00 2001
From: Benji
Date: Wed, 22 Aug 2018 13:31:03 +0800
Subject: [PATCH 11/56] python3 minor bugfix (#5988)
* Update receive.py
* Update receive.py
* Update receive.py
---
frappe/email/receive.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frappe/email/receive.py b/frappe/email/receive.py
index 7fa3855b4c..f77e8a80d9 100644
--- a/frappe/email/receive.py
+++ b/frappe/email/receive.py
@@ -283,7 +283,7 @@ class EmailServer:
flags = []
for flag in imaplib.ParseFlags(flag_string) or []:
pattern = re.compile("\w+")
- match = re.search(pattern, flag)
+ match = re.search(pattern, frappe.as_unicode(flag))
flags.append(match.group(0))
if "Seen" in flags:
From 78d061ced5a835554d6fca3e578996f52cbe29d6 Mon Sep 17 00:00:00 2001
From: Himanshu Mishra
Date: Wed, 22 Aug 2018 11:03:08 +0530
Subject: [PATCH 12/56] [feature] bench jupyter command (#5983)
* [feature]: bench jupyter
* fix: sites path in init
* fix: handle OSError instead of all
---
frappe/commands/utils.py | 40 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 40 insertions(+)
diff --git a/frappe/commands/utils.py b/frappe/commands/utils.py
index 3e27575418..c6cddf54f8 100644
--- a/frappe/commands/utils.py
+++ b/frappe/commands/utils.py
@@ -315,6 +315,45 @@ def mariadb(context):
'--pager=less -SFX',
"-A"])
+@click.command('jupyter')
+@pass_context
+def jupyter(context):
+ try:
+ from pip import main
+ except ImportError:
+ from pip._internal import main
+
+ reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])
+ installed_packages = [r.decode().split('==')[0] for r in reqs.split()]
+ if 'jupyter' not in installed_packages:
+ main(['install', 'jupyter'])
+ site = get_site(context)
+ frappe.init(site=site)
+ jupyter_notebooks_path = os.path.abspath(frappe.get_site_path('jupyter_notebooks'))
+ sites_path = os.path.abspath(frappe.get_site_path('..'))
+ try:
+ os.stat(jupyter_notebooks_path)
+ except OSError:
+ print('Creating folder to keep jupyter notebooks at {}'.format(jupyter_notebooks_path))
+ os.mkdir(jupyter_notebooks_path)
+ bin_path = os.path.abspath('../env/bin')
+ print('''
+Stating Jupyter notebook
+Run the following in your first cell to connect notebook to frappe
+```
+import frappe
+frappe.init(site='{site}', sites_path='{sites_path}')
+frappe.connect()
+frappe.local.lang = frappe.db.get_default('lang')
+frappe.db.connect()
+```
+ '''.format(site=site, sites_path=sites_path))
+ os.execv('{0}/jupyter'.format(bin_path), [
+ '{0}/jupyter'.format(bin_path),
+ 'notebook',
+ jupyter_notebooks_path,
+ ])
+
@click.command('console')
@pass_context
def console(context):
@@ -610,6 +649,7 @@ commands = [
build,
clear_cache,
clear_website_cache,
+ jupyter,
console,
destroy_all_sessions,
execute,
From 9f04cfc96861670e7bb4a6fdb084accf1dcfe5a1 Mon Sep 17 00:00:00 2001
From: Prateeksha Singh
Date: Thu, 23 Aug 2018 10:03:28 +0530
Subject: [PATCH 13/56] [webform][attachments] allow saving filename, insert
file path later
---
frappe/website/doctype/web_form/web_form.py | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/frappe/website/doctype/web_form/web_form.py b/frappe/website/doctype/web_form/web_form.py
index 64f54c891e..21bb16fcd3 100644
--- a/frappe/website/doctype/web_form/web_form.py
+++ b/frappe/website/doctype/web_form/web_form.py
@@ -380,7 +380,8 @@ def accept(web_form, data, for_payment=False):
if df and df.fieldtype in ('Attach', 'Attach Image'):
if value and 'data:' and 'base64' in value:
files.append((fieldname, value))
- doc.set(fieldname, '')
+ if not doc.name:
+ doc.set(fieldname, '')
continue
elif not value and doc.get(fieldname):
@@ -404,7 +405,9 @@ def accept(web_form, data, for_payment=False):
if web_form.login_required and frappe.session.user=="Guest":
frappe.throw(_("You must login to submit this form"))
- doc.insert(ignore_permissions = True, ignore_mandatory = True if files else False)
+ ignore_mandatory = True if files else False
+
+ doc.insert(ignore_permissions = True, ignore_mandatory = ignore_mandatory)
# add files
if files:
From e2582c630612aa5e8ebf142713e82abd4d249477 Mon Sep 17 00:00:00 2001
From: Faris Ansari
Date: Thu, 23 Aug 2018 15:40:19 +0530
Subject: [PATCH 14/56] fix(meta): Load assets only once in meta (#6004)
---
frappe/desk/form/meta.py | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/frappe/desk/form/meta.py b/frappe/desk/form/meta.py
index 878bb25d63..49ec67c4c7 100644
--- a/frappe/desk/form/meta.py
+++ b/frappe/desk/form/meta.py
@@ -39,6 +39,9 @@ class FormMeta(Meta):
self.load_assets()
def load_assets(self):
+ if self.get('__assets_loaded', False):
+ return
+
self.add_search_fields()
self.add_linked_document_type()
@@ -51,6 +54,8 @@ class FormMeta(Meta):
self.load_dashboard()
self.load_kanban_meta()
+ self.set('__assets_loaded', True)
+
def as_dict(self, no_nulls=False):
d = super(FormMeta, self).as_dict(no_nulls=no_nulls)
From c5323fd5369f032c48312ba509c28fbe27db6c8b Mon Sep 17 00:00:00 2001
From: Himanshu Mishra
Date: Thu, 23 Aug 2018 15:54:34 +0530
Subject: [PATCH 15/56] [fix]: decorate get_sidebar_stats with frappe.read_only
(#6003)
---
frappe/desk/reportview.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/frappe/desk/reportview.py b/frappe/desk/reportview.py
index 92f7e66d34..de80a0ae8a 100644
--- a/frappe/desk/reportview.py
+++ b/frappe/desk/reportview.py
@@ -233,6 +233,7 @@ def delete_items():
return failed
@frappe.whitelist()
+@frappe.read_only()
def get_sidebar_stats(stats, doctype, filters=[]):
cat_tags = frappe.db.sql("""select tag.parent as category, tag.tag_name as tag
from `tabTag Doc Category` as docCat
From 503da4d7d7d3c89ce3169869dd256da4d61b460c Mon Sep 17 00:00:00 2001
From: Shreya Shah
Date: Thu, 23 Aug 2018 16:00:43 +0530
Subject: [PATCH 16/56] Modify smallest currency fraction for USD (#6000)
---
frappe/geo/country_info.json | 2 +-
frappe/patches.txt | 3 ++-
frappe/patches/v10_0/modify_smallest_currency_fraction.py | 7 +++++++
3 files changed, 10 insertions(+), 2 deletions(-)
create mode 100644 frappe/patches/v10_0/modify_smallest_currency_fraction.py
diff --git a/frappe/geo/country_info.json b/frappe/geo/country_info.json
index f3a251f72d..41b8b3de81 100644
--- a/frappe/geo/country_info.json
+++ b/frappe/geo/country_info.json
@@ -2554,7 +2554,7 @@
"currency": "USD",
"currency_fraction": "Cent",
"currency_fraction_units": 100,
- "smallest_currency_fraction_value": 0.05,
+ "smallest_currency_fraction_value": 0.01,
"currency_name": "US Dollar",
"currency_symbol": "$",
"date_format": "mm-dd-yyyy",
diff --git a/frappe/patches.txt b/frappe/patches.txt
index ca22f99fbe..7025c7fafb 100644
--- a/frappe/patches.txt
+++ b/frappe/patches.txt
@@ -203,4 +203,5 @@ execute:frappe.delete_doc('Page', 'data-import-tool', ignore_missing=True)
frappe.patches.v10_0.reload_countries_and_currencies
frappe.patches.v10_0.set_no_copy_to_workflow_state
frappe.patches.v10_0.increase_single_table_column_length
-frappe.patches.v10_0.set_default_locking_time
\ No newline at end of file
+frappe.patches.v10_0.set_default_locking_time
+frappe.patches.v10_0.modify_smallest_currency_fraction
\ No newline at end of file
diff --git a/frappe/patches/v10_0/modify_smallest_currency_fraction.py b/frappe/patches/v10_0/modify_smallest_currency_fraction.py
new file mode 100644
index 0000000000..c9ae477359
--- /dev/null
+++ b/frappe/patches/v10_0/modify_smallest_currency_fraction.py
@@ -0,0 +1,7 @@
+# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
+# MIT License. See license.txt
+
+import frappe
+
+def execute():
+ frappe.db.set_value('Currency', 'USD', 'smallest_currency_fraction_value', '0.01')
\ No newline at end of file
From b672cba9dcbb9936323fa2b0afea73506615a037 Mon Sep 17 00:00:00 2001
From: Rushabh Mehta
Date: Thu, 23 Aug 2018 16:01:05 +0530
Subject: [PATCH 17/56] enhance(control): eval expression in numeric fields
(#5995)
* enhance(control): eval expression in numeric fields
* fix(control): handle bad expression
---
frappe/public/js/frappe/form/controls/float.js | 1 +
frappe/public/js/frappe/form/controls/int.js | 14 +++++++++++++-
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/frappe/public/js/frappe/form/controls/float.js b/frappe/public/js/frappe/form/controls/float.js
index 3a88e0103f..6ebaaa4075 100644
--- a/frappe/public/js/frappe/form/controls/float.js
+++ b/frappe/public/js/frappe/form/controls/float.js
@@ -1,5 +1,6 @@
frappe.ui.form.ControlFloat = frappe.ui.form.ControlInt.extend({
parse: function(value) {
+ value = this.eval_expression(value);
return isNaN(parseFloat(value)) ? null : flt(value, this.get_precision());
},
diff --git a/frappe/public/js/frappe/form/controls/int.js b/frappe/public/js/frappe/form/controls/int.js
index 25476296e9..c887afe6e0 100644
--- a/frappe/public/js/frappe/form/controls/int.js
+++ b/frappe/public/js/frappe/form/controls/int.js
@@ -19,7 +19,19 @@ frappe.ui.form.ControlInt = frappe.ui.form.ControlData.extend({
return false;
});
},
+ eval_expression: function(value) {
+ if (typeof value==='string' && value.match(/^[0-9+-/* ]+$/)) {
+ try {
+ return eval(value);
+ } catch (e) {
+ // bad expression
+ return value;
+ }
+ } else {
+ return value;
+ }
+ },
parse: function(value) {
- return cint(value, null);
+ return cint(this.eval_expression(value), null);
}
});
From 8776376c13dccdf5bd17bca56702395fb56aa538 Mon Sep 17 00:00:00 2001
From: Ameya Shenoy
Date: Thu, 23 Aug 2018 10:47:01 +0000
Subject: [PATCH 18/56] multi fixes
- [fix] removed _ as a variable since it is used in translations
- linting fixes
- added error logging for permission errors
---
frappe/utils/print_format.py | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/frappe/utils/print_format.py b/frappe/utils/print_format.py
index 563508923b..ca6ff8c2d3 100644
--- a/frappe/utils/print_format.py
+++ b/frappe/utils/print_format.py
@@ -19,13 +19,13 @@ standard_format = "templates/print_formats/standard.html"
def download_multi_pdf(doctype, name, format=None):
"""
Concatenate multiple docs as PDF .
-
+
Returns a PDF compiled by concatenating multiple documents. The documents
can be from a single DocType or multiple DocTypes
Note: The design may seem a little weird, but it exists exists to
ensure backward compatibility. The correct way to use this function is to
- pass a dict to doctype as described below
+ pass a dict to doctype as described below
NEW FUNCTIONALITY
=================
@@ -63,13 +63,16 @@ def download_multi_pdf(doctype, name, format=None):
result = json.loads(name)
# Concatenating pdf files
- for _, ss in enumerate(result):
+ for i, ss in enumerate(result):
output = frappe.get_print(doctype, ss, format, as_pdf = True, output = output)
frappe.local.response.filename = "{doctype}.pdf".format(doctype=doctype.replace(" ", "-").replace("/", "-"))
else:
for doctype_name in doctype:
for doc_name in doctype[doctype_name]:
- output = frappe.get_print(doctype_name, doc_name, format, as_pdf = True, output = output)
+ try:
+ output = frappe.get_print(doctype_name, doc_name, format, as_pdf = True, output = output)
+ except Exception:
+ frappe.log_error("Permission Error on doc {} of doctype {}".format(doc_name, doctype_name))
frappe.local.response.filename = "{}.pdf".format(name)
frappe.local.response.filecontent = read_multi_pdf(output)
From aeed1979f6e7c30614eb1ef4d78d90495fb4bacb Mon Sep 17 00:00:00 2001
From: Faris Ansari
Date: Fri, 24 Aug 2018 15:14:31 +0530
Subject: [PATCH 19/56] Portal list filters (#6007)
* Add list filters in portal
* Show label on input
---
frappe/templates/includes/list/filters.js | 46 +++++++++++++++++++
.../doctype/web_form/templates/web_form.html | 3 ++
frappe/website/doctype/web_form/web_form.py | 2 +-
.../web_form_field/web_form_field.json | 37 +++++++++++++--
4 files changed, 84 insertions(+), 4 deletions(-)
create mode 100644 frappe/templates/includes/list/filters.js
diff --git a/frappe/templates/includes/list/filters.js b/frappe/templates/includes/list/filters.js
new file mode 100644
index 0000000000..c5a1109ab1
--- /dev/null
+++ b/frappe/templates/includes/list/filters.js
@@ -0,0 +1,46 @@
+function setup_list_filters() {
+ const { web_form_doctype, web_form_name } = web_form_settings;
+
+ frappe.call('frappe.website.doctype.web_form.web_form.get_form_data', {
+ doctype: web_form_doctype, web_form_name
+ })
+ .then((r) => {
+ if (!r.message) return;
+ const web_form = r.message.web_form;
+
+ web_form_filters = web_form.web_form_fields.filter(df => {
+ return df.show_in_filter
+ && !['Text', 'Text Editor', 'Attach', 'Attach Image', 'Read Only'].includes(df.fieldtype)
+ && !df.readonly
+ }).map(df => {
+ const value = frappe.utils.get_query_params()[df.fieldname];
+ const f = frappe.ui.form.make_control({
+ df: {
+ fieldname: df.fieldname,
+ fieldtype: df.fieldtype,
+ label: df.label,
+ options: df.options,
+ change: (e) => {
+ const query_params = Object.assign(frappe.utils.get_query_params(), {
+ [df.fieldname]: f.get_value()
+ })
+ const query_string = frappe.utils.make_query_string(query_params);
+ window.location.replace(query_string)
+ }
+ },
+ parent: $('.list-filters'),
+ render_input: true
+ });
+
+ $(f.wrapper).addClass('col-md-3');
+
+ if (value) {
+ f.set_input(value);
+ }
+
+ return f;
+ });
+ });
+}
+
+frappe.ready(setup_list_filters);
diff --git a/frappe/website/doctype/web_form/templates/web_form.html b/frappe/website/doctype/web_form/templates/web_form.html
index 09576c7ba8..299a8302ec 100644
--- a/frappe/website/doctype/web_form/templates/web_form.html
+++ b/frappe/website/doctype/web_form/templates/web_form.html
@@ -65,6 +65,9 @@
{% elif is_list %}
+
+
+
{% if show_in_grid %}
diff --git a/frappe/website/doctype/web_form/web_form.py b/frappe/website/doctype/web_form/web_form.py
index 21bb16fcd3..c75bf7fb77 100644
--- a/frappe/website/doctype/web_form/web_form.py
+++ b/frappe/website/doctype/web_form/web_form.py
@@ -519,7 +519,7 @@ def make_route_string(parameters):
return (route_string, delimeter)
@frappe.whitelist(allow_guest=True)
-def get_form_data(doctype, docname, web_form_name):
+def get_form_data(doctype, docname=None, web_form_name=None):
out = frappe._dict()
if docname:
diff --git a/frappe/website/doctype/web_form_field/web_form_field.json b/frappe/website/doctype/web_form_field/web_form_field.json
index b922759900..ceecdb9e3f 100644
--- a/frappe/website/doctype/web_form_field/web_form_field.json
+++ b/frappe/website/doctype/web_form_field/web_form_field.json
@@ -199,6 +199,38 @@
"translatable": 0,
"unique": 0
},
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "show_in_filter",
+ "fieldtype": "Check",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Show in filter",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
@@ -489,7 +521,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2018-07-31 12:43:36.847174",
+ "modified": "2018-08-23 21:04:13.786287",
"modified_by": "Administrator",
"module": "Website",
"name": "Web Form Field",
@@ -503,6 +535,5 @@
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 0,
- "track_seen": 0,
- "track_views": 0
+ "track_seen": 0
}
\ No newline at end of file
From aef4e03b3ddb6bd79bcf5d24ae2ea19163f8edb3 Mon Sep 17 00:00:00 2001
From: Neil Trini Lasrado
Date: Fri, 24 Aug 2018 15:15:48 +0530
Subject: [PATCH 20/56] Use email title hook to fetch subject in Welcome Emails
sent to new users (#5984)
* Fix email title hook
* Welcome email code cleanup
---
frappe/core/doctype/user/user.py | 26 ++++++++++----------------
1 file changed, 10 insertions(+), 16 deletions(-)
diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py
index 4135468c41..be99c7f06b 100644
--- a/frappe/core/doctype/user/user.py
+++ b/frappe/core/doctype/user/user.py
@@ -252,20 +252,17 @@ class User(Document):
def send_welcome_mail_to_user(self):
from frappe.utils import get_url
-
link = self.reset_password()
- app_title = None
-
- method = frappe.get_hooks('get_site_info')
+ subject = None
+ method = frappe.get_hooks("welcome_email")
if method:
- get_site_info = frappe.get_attr(method[0])
- site_info = get_site_info({})
- app_title = site_info.get('company', None)
-
- if app_title:
- subject = _("Welcome to {0}").format(app_title)
- else:
- subject = _("Complete Registration")
+ subject = frappe.get_attr(method[-1])()
+ if not subject:
+ site_name = frappe.db.get_default('site_name') or frappe.get_conf().get("site_name")
+ if site_name:
+ subject = _("Welcome to {0}".format(site_name))
+ else:
+ subject = _("Complete Registration")
self.send_login_mail(subject, "new_user",
dict(
@@ -278,9 +275,6 @@ class User(Document):
from frappe.utils.user import get_user_fullname
from frappe.utils import get_url
- mail_titles = frappe.get_hooks().get("login_mail_title", [])
- title = frappe.db.get_default('company') or (mail_titles and mail_titles[0]) or ""
-
full_name = get_user_fullname(frappe.session['user'])
if full_name == "Guest":
full_name = "Administrator"
@@ -288,7 +282,7 @@ class User(Document):
args = {
'first_name': self.first_name or self.last_name or "user",
'user': self.name,
- 'title': title,
+ 'title': subject,
'login_url': get_url(),
'user_fullname': full_name
}
From 565c4b24d4a54ea8fa44d9f58fc66d863bad354a Mon Sep 17 00:00:00 2001
From: Zarrar
Date: Fri, 24 Aug 2018 15:18:20 +0530
Subject: [PATCH 21/56] [Enhance] Data Import (#5962)
* fix checkbox toggling for mandatory option
* update / insert functionality added
* minor changes for naming_series and with_data_download
* changes related to insert record
* show name field as mandatory for update records
* codacy fix
* add parent field to file incase of importing only child table for new records
* test case fixes for Data Import
* added select option instead of checkbox for inert/update
* make action field mandatory
---
frappe/core/doctype/data_export/exporter.py | 50 ++-
.../core/doctype/data_import/data_import.js | 38 +-
.../core/doctype/data_import/data_import.json | 380 +++++++++++-------
frappe/core/doctype/data_import/importer.py | 2 +-
.../doctype/data_import/test_data_import.js | 23 ++
.../doctype/data_import/test_data_import.py | 15 +-
6 files changed, 329 insertions(+), 179 deletions(-)
create mode 100644 frappe/core/doctype/data_import/test_data_import.js
diff --git a/frappe/core/doctype/data_export/exporter.py b/frappe/core/doctype/data_export/exporter.py
index ca1fc6cd3f..e19beef476 100644
--- a/frappe/core/doctype/data_export/exporter.py
+++ b/frappe/core/doctype/data_export/exporter.py
@@ -77,13 +77,13 @@ class DataExporter:
self.add_main_header()
self.writer.writerow([''])
- self.tablerow = [self.data_keys.doctype, ""]
- self.labelrow = [_("Column Labels:"), "ID"]
- self.fieldrow = [self.data_keys.columns, self.name_field]
- self.mandatoryrow = [_("Mandatory:"), _("Yes")]
- self.typerow = [_('Type:'), 'Data (text)']
- self.inforow = [_('Info:'), '']
- self.columns = [self.name_field]
+ self.tablerow = [self.data_keys.doctype]
+ self.labelrow = [_("Column Labels:")]
+ self.fieldrow = [self.data_keys.columns]
+ self.mandatoryrow = [_("Mandatory:")]
+ self.typerow = [_('Type:')]
+ self.inforow = [_('Info:')]
+ self.columns = []
self.build_field_columns(self.doctype)
@@ -144,19 +144,26 @@ class DataExporter:
_column_start_end = frappe._dict(start=0)
if dt==self.doctype:
+ if (meta.get('autoname') and meta.get('autoname').lower()=='prompt') or (self.with_data):
+ self._append_name_column()
+
+ # if importing only child table for new record, add parent field
+ if meta.get('istable') and not self.with_data:
+ self.append_field_column(frappe._dict({
+ "fieldname": "parent",
+ "parent": "",
+ "label": "Parent",
+ "fieldtype": "Data",
+ "reqd": 1,
+ "info": _("Parent is the name of the document to which the data will get added to.")
+ }), True)
+
_column_start_end = frappe._dict(start=0)
else:
_column_start_end = frappe._dict(start=len(self.columns))
- self.append_field_column(frappe._dict({
- "fieldname": "name",
- "parent": dt,
- "label": "ID",
- "fieldtype": "Data",
- "reqd": 1,
- "idx": 0,
- "info": _("Leave blank for new records")
- }), True)
+ if self.with_data:
+ self._append_name_column(dt)
for docfield in tablecolumns:
self.append_field_column(docfield, True)
@@ -190,7 +197,8 @@ class DataExporter:
return
if docfield.hidden:
return
- if self.select_columns and docfield.fieldname not in self.select_columns.get(docfield.parent, []):
+ if self.select_columns and docfield.fieldname not in self.select_columns.get(docfield.parent, []) \
+ and docfield.fieldname!="name":
return
self.tablerow.append("")
@@ -337,3 +345,11 @@ class DataExporter:
frappe.response['filecontent'] = xlsx_file.getvalue()
frappe.response['type'] = 'binary'
+ def _append_name_column(self, dt=None):
+ self.append_field_column(frappe._dict({
+ "fieldname": "name" if dt else self.name_field,
+ "parent": dt or "",
+ "label": "ID",
+ "fieldtype": "Data",
+ "reqd": 1,
+ }), True)
diff --git a/frappe/core/doctype/data_import/data_import.js b/frappe/core/doctype/data_import/data_import.js
index 3473e3e15d..3366a40190 100644
--- a/frappe/core/doctype/data_import/data_import.js
+++ b/frappe/core/doctype/data_import/data_import.js
@@ -3,6 +3,10 @@
frappe.ui.form.on('Data Import', {
onload: function(frm) {
+ if(frm.doc.__islocal) {
+ frm.set_value("action", "");
+ }
+
frm.set_query("reference_doctype", function() {
return {
"filters": {
@@ -53,6 +57,10 @@ frappe.ui.form.on('Data Import', {
frappe.model.with_doctype(frm.doc.reference_doctype);
}
+ if(frm.doc.action == "Insert new records" || frm.doc.action == "Update records") {
+ frm.set_df_property("action", "read_only", 1);
+ }
+
frm.add_custom_button(__("Help"), function() {
frappe.help.show_video("6wiriRKPhmg");
});
@@ -82,15 +90,18 @@ frappe.ui.form.on('Data Import', {
}
},
- reference_doctype: function(frm) {
- if (frm.doc.reference_doctype) {
- frm.save();
+ action: function(frm) {
+ if(!frm.doc.action) return;
+ if(!frm.doc.reference_doctype) {
+ frappe.msgprint(__("Please select document type first."));
+ frm.set_value("action", "");
+ return;
}
- },
- overwrite: function(frm) {
- if (frm.doc.overwrite === 0) {
- frm.doc.only_update = 0;
+ if(frm.doc.action == "Insert new records") {
+ frm.doc.insert_new = 1;
+ } else if (frm.doc.action == "Update records"){
+ frm.doc.overwrite = 1;
}
frm.save();
},
@@ -149,8 +160,8 @@ frappe.data_import.download_dialog = function(frm) {
const doctype_fields = get_fields(frm.doc.reference_doctype)
.map(df => ({
- label: df.label + (df.reqd ? ' (M)' : ''),
- reqd: df.reqd ? 1 : 0,
+ label: df.label + ((df.reqd || df.fieldname == 'naming_series') ? ' (M)' : ''),
+ reqd: (df.reqd || df.fieldname == 'naming_series') ? 1 : 0,
value: df.fieldname,
checked: 1
}));
@@ -170,7 +181,7 @@ frappe.data_import.download_dialog = function(frm) {
fields.map(multicheck_field => {
multicheck_field.options.map(option => {
if(!option.reqd) return;
- $(dialog.body).find(`:checkbox[data-unit="${option.value}"]`)
+ $(multicheck_field.$wrapper).find(`:checkbox[data-unit="${option.value}"]`)
.prop('checked', false)
.trigger('click')
.prop('disabled', true);
@@ -189,11 +200,6 @@ frappe.data_import.download_dialog = function(frm) {
"options": "Excel\nCSV",
"default": "Excel"
},
- {
- "label": __("Download with Data"),
- "fieldname": "with_data",
- "fieldtype": "Check"
- },
{
"label": __("Select All"),
"fieldname": "select_all",
@@ -263,7 +269,7 @@ frappe.data_import.download_dialog = function(frm) {
doctype: frm.doc.reference_doctype,
parent_doctype: frm.doc.reference_doctype,
select_columns: JSON.stringify(columns),
- with_data: data.with_data,
+ with_data: frm.doc.overwrite,
all_doctypes: true,
file_type: data.file_type,
template: true
diff --git a/frappe/core/doctype/data_import/data_import.json b/frappe/core/doctype/data_import/data_import.json
index e598a32922..e314402b39 100644
--- a/frappe/core/doctype/data_import/data_import.json
+++ b/frappe/core/doctype/data_import/data_import.json
@@ -15,6 +15,7 @@
"fields": [
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -43,17 +44,157 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "action",
+ "fieldtype": "Select",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Action",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Insert new records\nUpdate records",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "default": "0",
+ "depends_on": "eval:!doc.overwrite",
+ "description": "New data will be inserted.",
+ "fieldname": "insert_new",
+ "fieldtype": "Check",
+ "hidden": 1,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Insert new records",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 1,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "default": "0",
+ "depends_on": "eval:!doc.insert_new",
+ "description": "If you are updating/overwriting already created records.",
+ "fieldname": "overwrite",
+ "fieldtype": "Check",
+ "hidden": 1,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Update records",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 1,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "default": "0",
+ "depends_on": "overwrite",
+ "description": "If you don't want to create any new records while updating the older records.",
+ "fieldname": "only_update",
+ "fieldtype": "Check",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Don't create new records",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"collapsible_depends_on": "",
"columns": 0,
"depends_on": "eval:(!doc.__islocal)",
- "fieldname": "section_break_4",
+ "fieldname": "section_break_4",
"fieldtype": "Section Break",
"hidden": 0,
"ignore_user_permissions": 0,
@@ -74,16 +215,83 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "",
- "fieldname": "import_file",
+ "fieldname": "import_file",
+ "fieldtype": "Attach",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Attach file for Import",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "column_break_4",
+ "fieldtype": "Column Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "depends_on": "eval: doc.import_status == \"Partially Successful\"",
+ "description": "This is the template file generated with only the rows having some error. You should use this file for correction and import.",
+ "fieldname": "error_file",
"fieldtype": "Attach",
"hidden": 0,
"ignore_user_permissions": 0,
@@ -92,7 +300,7 @@
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
- "label": "Attach file for Import",
+ "label": "Generated File",
"length": 0,
"no_copy": 0,
"permlevel": 0,
@@ -105,16 +313,20 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
+ "collapsible_depends_on": "",
"columns": 0,
- "fieldname": "column_break_4",
- "fieldtype": "Column Break",
+ "depends_on": "eval:(!doc.__islocal)",
+ "fieldname": "section_break_6",
+ "fieldtype": "Section Break",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
@@ -134,139 +346,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "eval: doc.import_status == \"Partially Successful\"",
- "description": "This is the template file generated with only the rows having some error. You should use this file for correction and import.",
- "fieldname": "error_file",
- "fieldtype": "Attach",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Generated File",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "collapsible_depends_on": "",
- "columns": 0,
- "depends_on": "eval:(!doc.__islocal)",
- "fieldname": "section_break_6",
- "fieldtype": "Section Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "default": "0",
- "depends_on": "",
- "description": "If you are updating/overwriting already created records.",
- "fieldname": "overwrite",
- "fieldtype": "Check",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Update records",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "default": "0",
- "depends_on": "overwrite",
- "description": "If you don't want to create any new records while updating the older records.",
- "fieldname": "only_update",
- "fieldtype": "Check",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Don't create new records",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -294,10 +379,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -326,10 +413,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -358,10 +447,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -390,10 +481,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 1,
@@ -422,10 +515,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -454,10 +549,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
@@ -485,10 +582,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
@@ -517,10 +616,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
@@ -548,10 +649,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -578,10 +681,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -608,6 +713,7 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
}
],
@@ -621,7 +727,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 1,
- "modified": "2017-12-15 14:49:24.622128",
+ "modified": "2018-08-23 15:05:56.787108",
"modified_by": "Administrator",
"module": "Core",
"name": "Data Import",
@@ -630,7 +736,6 @@
"permissions": [
{
"amend": 0,
- "apply_user_permissions": 0,
"cancel": 0,
"create": 1,
"delete": 1,
@@ -657,5 +762,6 @@
"sort_order": "DESC",
"title_field": "",
"track_changes": 1,
- "track_seen": 1
+ "track_seen": 1,
+ "track_views": 0
}
\ No newline at end of file
diff --git a/frappe/core/doctype/data_import/importer.py b/frappe/core/doctype/data_import/importer.py
index b9ce645d8e..c5b8c1a94b 100644
--- a/frappe/core/doctype/data_import/importer.py
+++ b/frappe/core/doctype/data_import/importer.py
@@ -204,7 +204,7 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
# importing the item variant where item code and item name will be blank.
def main_doc_empty(row):
if row:
- for i in range(3,1,-1):
+ for i in range(3,0,-1):
if len(row) > i and row[i]:
return False
return True
diff --git a/frappe/core/doctype/data_import/test_data_import.js b/frappe/core/doctype/data_import/test_data_import.js
new file mode 100644
index 0000000000..fbce7781b6
--- /dev/null
+++ b/frappe/core/doctype/data_import/test_data_import.js
@@ -0,0 +1,23 @@
+/* eslint-disable */
+// rename this file from _test_[name] to test_[name] to activate
+// and remove above this line
+
+QUnit.test("test: Data Import", function (assert) {
+ let done = assert.async();
+
+ // number of asserts
+ assert.expect(1);
+
+ frappe.run_serially([
+ // insert a new Data Import
+ () => frappe.tests.make('Data Import', [
+ // values to be set
+ {key: 'value'}
+ ]),
+ () => {
+ assert.equal(cur_frm.doc.key, 'value');
+ },
+ () => done()
+ ]);
+
+});
diff --git a/frappe/core/doctype/data_import/test_data_import.py b/frappe/core/doctype/data_import/test_data_import.py
index d181d49457..2c01f527fa 100644
--- a/frappe/core/doctype/data_import/test_data_import.py
+++ b/frappe/core/doctype/data_import/test_data_import.py
@@ -35,7 +35,7 @@ class TestDataImport(unittest.TestCase):
exporter.export_data("Blog Category", all_doctypes=True, template=True)
content = read_csv_content(frappe.response.result)
- content.append(["", "", "test-category", "Test Cateogry"])
+ content.append(["", "test-category", "Test Cateogry"])
importer.upload(content)
self.assertTrue(frappe.db.get_value("Blog Category", "test-category", "title"), "Test Category")
@@ -51,7 +51,7 @@ class TestDataImport(unittest.TestCase):
def test_import_only_children(self):
user_email = "test_import_userrole@example.com"
if frappe.db.exists("User", user_email):
- frappe.delete_doc("User", user_email)
+ frappe.delete_doc("User", user_email, force=True)
frappe.get_doc({"doctype": "User", "email": user_email, "first_name": "Test Import UserRole"}).insert()
@@ -81,10 +81,9 @@ class TestDataImport(unittest.TestCase):
content = read_csv_content(frappe.response.result)
content.append([None] * len(content[-2]))
- content[-1][1] = "EV00001"
- content[-1][2] = "__Test Event with children"
- content[-1][3] = "Private"
- content[-1][4] = "2014-01-01 10:00:00.000000"
+ content[-1][1] = "__Test Event with children"
+ content[-1][2] = "Private"
+ content[-1][3] = "2014-01-01 10:00:00.000000"
importer.upload(content)
frappe.get_doc("Event", {"subject":"__Test Event with children"})
@@ -96,6 +95,6 @@ class TestDataImport(unittest.TestCase):
exporter.export_data("Event", all_doctypes=True, template=True, file_type="Excel")
from frappe.utils.xlsxutils import read_xlsx_file_from_attached_file
content = read_xlsx_file_from_attached_file(fcontent=frappe.response.filecontent)
- content.append(["", "EV00001", "_test", "Private", "05-11-2017 13:51:48", "0", "0", "", "1", "blue"])
+ content.append(["", "_test", "Private", "05-11-2017 13:51:48", "0", "0", "", "1", "blue"])
importer.upload(content)
- self.assertTrue(frappe.db.get_value("Event", "EV00001", "subject"), "_test")
+ self.assertTrue(frappe.db.get_value("Event", {"subject": "_test"}, "name"))
From 6bb36a8c0effde92a670a1802bda35531d518e92 Mon Sep 17 00:00:00 2001
From: Charles-Henri Decultot
Date: Fri, 24 Aug 2018 11:52:41 +0200
Subject: [PATCH 22/56] Possibility to set custom calendar options (#5957)
* Possibility to set custom calendar options
* Codacy corrections
* Codacy correction
* Codacy corrections
* Set now indicator as default
* Weekend options as a button
* Codacy corrections
* Move preferences to localStorage
* Codacy corrections
* Update calendar.js
---
frappe/core/doctype/user/user.json | 143 +++++++++++++++++-
.../js/frappe/views/calendar/calendar.js | 63 ++++++--
2 files changed, 191 insertions(+), 15 deletions(-)
diff --git a/frappe/core/doctype/user/user.json b/frappe/core/doctype/user/user.json
index 69030e547b..15e7e5eaef 100644
--- a/frappe/core/doctype/user/user.json
+++ b/frappe/core/doctype/user/user.json
@@ -15,6 +15,7 @@
"fields": [
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -40,10 +41,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -72,10 +75,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -102,10 +107,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -134,10 +141,12 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -165,10 +174,12 @@
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -196,10 +207,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 1,
"collapsible": 0,
@@ -227,10 +240,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -257,10 +272,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 1,
"collapsible": 0,
@@ -289,10 +306,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -318,10 +337,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -348,11 +369,13 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0,
"width": "50%"
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -379,10 +402,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 1
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -410,10 +435,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -440,10 +467,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -470,10 +499,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -501,10 +532,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -532,10 +565,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -561,10 +596,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -592,10 +629,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 1,
@@ -622,10 +661,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -654,10 +695,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -684,10 +727,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -714,10 +759,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 1
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -745,10 +792,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -774,10 +823,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -802,10 +853,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -831,10 +884,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -861,10 +916,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 1,
@@ -891,10 +948,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -920,10 +979,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -951,10 +1012,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -982,10 +1045,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1011,10 +1076,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1041,10 +1108,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 1,
@@ -1072,10 +1141,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1103,10 +1174,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1133,10 +1206,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1162,10 +1237,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 1,
@@ -1192,10 +1269,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1224,10 +1303,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 1,
@@ -1255,10 +1336,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1285,10 +1368,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1316,10 +1401,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 1,
@@ -1348,10 +1435,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1378,10 +1467,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1409,10 +1500,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1441,11 +1534,13 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0,
"width": "50%"
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1473,10 +1568,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 1,
@@ -1504,10 +1601,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1535,10 +1634,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1569,10 +1670,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1599,10 +1702,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1629,10 +1734,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1659,10 +1766,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1691,10 +1800,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1721,11 +1832,13 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0,
"width": "50%"
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1753,10 +1866,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1784,10 +1899,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1814,10 +1931,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1845,10 +1964,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 1,
@@ -1875,10 +1996,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1906,10 +2029,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 1,
@@ -1936,10 +2061,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1967,10 +2094,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 1
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -1997,10 +2126,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -2026,10 +2157,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -2056,6 +2189,7 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
}
],
@@ -2072,15 +2206,14 @@
"istable": 0,
"max_attachments": 5,
"menu_index": 0,
- "modified": "2018-06-29 10:55:32.946017",
- "modified_by": "shridhar.p@zerodha.com",
+ "modified": "2018-08-15 12:12:06.215199",
+ "modified_by": "Administrator",
"module": "Core",
"name": "User",
"owner": "Administrator",
"permissions": [
{
"amend": 0,
- "apply_user_permissions": 0,
"cancel": 0,
"create": 1,
"delete": 1,
@@ -2100,7 +2233,6 @@
},
{
"amend": 0,
- "apply_user_permissions": 0,
"cancel": 0,
"create": 0,
"delete": 0,
@@ -2127,6 +2259,5 @@
"sort_order": "DESC",
"title_field": "full_name",
"track_changes": 1,
- "track_seen": 0,
- "track_views": 0
+ "track_seen": 0
}
\ No newline at end of file
diff --git a/frappe/public/js/frappe/views/calendar/calendar.js b/frappe/public/js/frappe/views/calendar/calendar.js
index 51c549cb6a..d7a93de572 100644
--- a/frappe/public/js/frappe/views/calendar/calendar.js
+++ b/frappe/public/js/frappe/views/calendar/calendar.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
// MIT License. See license.txt
frappe.provide("frappe.views.calendar");
@@ -26,7 +26,7 @@ frappe.views.CalendarView = class CalendarView extends frappe.views.ListView {
setup_defaults() {
super.setup_defaults();
- this.page_title = this.page_title + ' ' + __('Calendar');
+ this.page_title = __('{0} Calendar', [this.page_title]);
this.calendar_settings = frappe.views.calendar[this.doctype] || {};
this.calendar_name = frappe.get_route()[3];
}
@@ -49,13 +49,13 @@ frappe.views.CalendarView = class CalendarView extends frappe.views.ListView {
}
this.load_lib
- .then(() => this.get_calendar_options())
+ .then(() => this.get_calendar_preferences())
.then(options => {
this.calendar = new frappe.views.Calendar(options);
});
}
- get_calendar_options() {
+ get_calendar_preferences() {
const options = {
doctype: this.doctype,
parent: this.$result,
@@ -97,9 +97,24 @@ frappe.views.CalendarView = class CalendarView extends frappe.views.ListView {
frappe.views.Calendar = Class.extend({
init: function(options) {
$.extend(this, options);
- this.make_page();
- this.setup_options();
- this.make();
+ this.get_default_options();
+ },
+ get_default_options: function() {
+ return new Promise ((resolve) => {
+ let defaultView = localStorage.getItem('cal_defaultView');
+ let weekends = localStorage.getItem('cal_weekends');
+ let defaults = {
+ 'defaultView': defaultView ? defaultView : "month",
+ 'weekends': weekends ? weekends : true
+ };
+ resolve(defaults);
+ }).then(defaults => {
+ this.make_page();
+ this.setup_options(defaults);
+ this.make();
+ this.setup_view_mode_button(defaults);
+ this.bind();
+ });
},
make_page: function() {
var me = this;
@@ -129,6 +144,33 @@ frappe.views.Calendar = Class.extend({
this.$cal.fullCalendar(this.cal_options);
this.set_css();
},
+ setup_view_mode_button: function(defaults) {
+ var me = this;
+ $(me.footnote_area).find('.btn-weekend').detach();
+ let btnTitle = (defaults.weekends) ? __('Hide Weekends') : __('Show Weekends');
+ const btn = ``;
+ me.footnote_area.append(btn);
+ },
+ set_localStorage_option: function(option, value) {
+ localStorage.removeItem(option);
+ localStorage.setItem(option, value);
+ },
+ bind: function() {
+ const me = this;
+ let btn_group = me.$wrapper.find(".fc-button-group");
+ btn_group.on("click", ".btn", function() {
+ let value = ($(this).hasClass('fc-agendaWeek-button')) ? 'agendaWeek' : (($(this).hasClass('fc-agendaDay-button')) ? 'agendaDay' : 'month');
+ me.set_localStorage_option("cal_defaultView", value);
+ });
+
+ me.$wrapper.on("click", ".btn-weekend", function() {
+ me.cal_options.weekends = !me.cal_options.weekends;
+ me.$cal.fullCalendar('option', 'weekends', me.cal_options.weekends);
+ me.set_localStorage_option("cal_weekends", me.cal_options.weekends);
+ me.set_css();
+ me.setup_view_mode_button(me.cal_options);
+ });
+ },
set_css: function() {
// flatify buttons
this.$wrapper.find("button.fc-state-default")
@@ -166,19 +208,22 @@ frappe.views.Calendar = Class.extend({
date._offset = moment.user_utc_offset;
return frappe.datetime.convert_to_system_tz(date);
},
- setup_options: function() {
+ setup_options: function(defaults) {
var me = this;
this.cal_options = {
locale: frappe.boot.user.language || "en",
header: {
left: 'title',
center: '',
- right: 'prev,next month,agendaWeek,agendaDay'
+ right: 'prev,today,next month,agendaWeek,agendaDay'
},
editable: true,
selectable: true,
selectHelper: true,
forceEventDuration: true,
+ defaultView: defaults.defaultView,
+ weekends: defaults.weekends,
+ nowIndicator: true,
events: function(start, end, timezone, callback) {
return frappe.call({
method: me.get_events_method || "frappe.desk.calendar.get_events",
From dab491e55f3b707f86d2b9e287b23c90407a46e0 Mon Sep 17 00:00:00 2001
From: Charles-Henri Decultot
Date: Fri, 24 Aug 2018 11:53:20 +0200
Subject: [PATCH 23/56] Doctype links in foreign language (#5745)
* Doctype search in foreign language
* List comprehension slightly faster
* Remove obsolete comment
* Remove trailing whitespace
* Test case for address and contact query
* Refactor search and add tests
* Travis test debug
* Remove debug print
* Search limit removal for untranslated docs and tests refactor
* Remove old comments
* Test modification for Travis
* remove unused import
* Correct Role doctype
---
frappe/contacts/address_and_contact.py | 17 +++++++----------
frappe/desk/search.py | 11 +++++++++--
frappe/tests/test_search.py | 16 ++++++++++++++--
3 files changed, 30 insertions(+), 14 deletions(-)
diff --git a/frappe/contacts/address_and_contact.py b/frappe/contacts/address_and_contact.py
index cc650e2b74..2ab680c765 100644
--- a/frappe/contacts/address_and_contact.py
+++ b/frappe/contacts/address_and_contact.py
@@ -4,7 +4,9 @@
from __future__ import unicode_literals
import frappe
+from frappe import _
import functools
+import re
def load_address_and_contact(doc, key=None):
"""Loads address list and contact list in `__onload`"""
@@ -128,25 +130,20 @@ def delete_contact_and_address(doctype, docname):
def filter_dynamic_link_doctypes(doctype, txt, searchfield, start, page_len, filters):
if not txt: txt = ""
- txt = txt.lower()
- txt = "%%%s%%" % (txt)
-
- filters.update({
- "parent": ("like", txt)
- })
-
doctypes = frappe.db.get_all("DocField", filters=filters, fields=["parent"],
distinct=True, as_list=True)
- filters.pop("parent")
+ doctypes = tuple([d for d in doctypes if re.search(txt+".*", _(d[0]), re.IGNORECASE)])
+
filters.update({
- "dt": ("not in", [d[0] for d in doctypes]),
- "dt": ("like", txt),
+ "dt": ("not in", [d[0] for d in doctypes])
})
_doctypes = frappe.db.get_all("Custom Field", filters=filters, fields=["dt"],
as_list=True)
+ _doctypes = tuple([d for d in _doctypes if re.search(txt+".*", _(d[0]), re.IGNORECASE)])
+
all_doctypes = [d[0] for d in doctypes + _doctypes]
valid_doctypes = []
diff --git a/frappe/desk/search.py b/frappe/desk/search.py
index 7106311c1d..01a6192460 100644
--- a/frappe/desk/search.py
+++ b/frappe/desk/search.py
@@ -10,6 +10,7 @@ from frappe import _
from six import string_types
import re
+UNTRANSLATED_DOCTYPES = ["DocType", "Role"]
def sanitize_searchfield(searchfield):
blacklisted_keywords = ['select', 'delete', 'drop', 'update', 'case', 'and', 'or', 'like']
@@ -109,8 +110,8 @@ def search_widget(doctype, txt, query=None, searchfield=None, start=0,
for f in search_fields:
fmeta = meta.get_field(f.strip())
- if f == "name" or (fmeta and fmeta.fieldtype in ["Data", "Text", "Small Text", "Long Text",
- "Link", "Select", "Read Only", "Text Editor"]):
+ if (doctype not in UNTRANSLATED_DOCTYPES) and (f == "name" or (fmeta and fmeta.fieldtype in ["Data", "Text", "Small Text", "Long Text",
+ "Link", "Select", "Read Only", "Text Editor"])):
or_filters.append([doctype, f.strip(), "like", "%{0}%".format(txt)])
if meta.get("fields", {"fieldname":"enabled", "fieldtype":"Check"}):
@@ -136,6 +137,9 @@ def search_widget(doctype, txt, query=None, searchfield=None, start=0,
ignore_permissions = True if doctype == "DocType" else (cint(ignore_user_permissions) and has_permission(doctype))
+ if doctype in UNTRANSLATED_DOCTYPES:
+ page_length = None
+
values = frappe.get_list(doctype,
filters=filters, fields=formatted_fields,
or_filters = or_filters, limit_start = start,
@@ -144,6 +148,9 @@ def search_widget(doctype, txt, query=None, searchfield=None, start=0,
ignore_permissions = ignore_permissions,
as_list=not as_dict)
+ if doctype in UNTRANSLATED_DOCTYPES:
+ values = tuple([v for v in list(values) if re.search(txt+".*", (_(v.name) if as_dict else _(v[0])), re.IGNORECASE)])
+
# remove _relevance from results
if as_dict:
for r in values:
diff --git a/frappe/tests/test_search.py b/frappe/tests/test_search.py
index 9f1891753e..5cab827218 100644
--- a/frappe/tests/test_search.py
+++ b/frappe/tests/test_search.py
@@ -1,11 +1,11 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
# MIT License. See license.txt
from __future__ import unicode_literals
import unittest
import frappe
from frappe.desk.search import search_link
-
+from frappe.desk.search import search_widget
class TestSearch(unittest.TestCase):
def test_search_field_sanitizer(self):
@@ -38,3 +38,15 @@ class TestSearch(unittest.TestCase):
self.assertRaises(frappe.DataError,
search_link, 'DocType', 'Customer', query=None, filters=None,
page_length=20, searchfield=';')
+
+ #Search for the word "pay", part of the word "pays" (country) in french.
+ def test_link_search_in_foreign_language(self):
+ frappe.local.lang = 'fr'
+ search_widget(doctype="DocType", txt="pay", page_length=20)
+ output = frappe.response["values"]
+
+ result = [['found' for x in y if x=="Country"] for y in output]
+ self.assertTrue(['found'] in result)
+
+ def tearDown(self):
+ frappe.local.lang = 'en'
From 7448ea193850118855a896a34a2e294a45beb14e Mon Sep 17 00:00:00 2001
From: Prateeksha Singh
Date: Sun, 26 Aug 2018 09:41:00 +0530
Subject: [PATCH 24/56] [alerts] add data-actions in show_alert()
---
frappe/public/js/frappe/ui/messages.js | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/frappe/public/js/frappe/ui/messages.js b/frappe/public/js/frappe/ui/messages.js
index dbf5e8e064..5231e5a449 100644
--- a/frappe/public/js/frappe/ui/messages.js
+++ b/frappe/public/js/frappe/ui/messages.js
@@ -265,7 +265,7 @@ frappe.hide_progress = function() {
}
// Floating Message
-frappe.show_alert = function(message, seconds=7) {
+frappe.show_alert = function(message, seconds=7, actions={}) {
if(typeof message==='string') {
message = {
message: message
@@ -306,6 +306,10 @@ frappe.show_alert = function(message, seconds=7) {
return false;
});
+ Object.keys(actions).map(key => {
+ div.find(`[data-action=${key}]`).on('click', actions[key]);
+ });
+
div.delay(seconds * 1000).fadeOut(300);
return div;
}
From 9f61c47bc13348ec9586f718f178d16a21592a29 Mon Sep 17 00:00:00 2001
From: Valmik
Date: Mon, 27 Aug 2018 11:13:44 +0530
Subject: [PATCH 25/56] Rename google maps doctype, add helper methods (#6001)
* rename google maps doctype, add helper methods
* fixed patch to use correct check
---
frappe/config/integrations.py | 2 +-
.../doctype/google_maps/google_maps.py | 32 -------------------
.../__init__.py | 0
.../google_maps_settings.js} | 2 +-
.../google_maps_settings.json} | 17 +++++++---
.../google_maps_settings.py | 26 +++++++++++++++
.../test_google_maps_settings.js} | 4 +--
.../test_google_maps_settings.py} | 2 +-
frappe/patches.txt | 1 +
.../v11_0/rename_google_maps_doctype.py | 7 ++++
10 files changed, 51 insertions(+), 42 deletions(-)
mode change 100644 => 100755 frappe/config/integrations.py
delete mode 100644 frappe/integrations/doctype/google_maps/google_maps.py
rename frappe/integrations/doctype/{google_maps => google_maps_settings}/__init__.py (100%)
rename frappe/integrations/doctype/{google_maps/google_maps.js => google_maps_settings/google_maps_settings.js} (72%)
mode change 100644 => 100755
rename frappe/integrations/doctype/{google_maps/google_maps.json => google_maps_settings/google_maps_settings.json} (90%)
create mode 100755 frappe/integrations/doctype/google_maps_settings/google_maps_settings.py
rename frappe/integrations/doctype/{google_maps/test_google_maps.js => google_maps_settings/test_google_maps_settings.js} (76%)
mode change 100644 => 100755
rename frappe/integrations/doctype/{google_maps/test_google_maps.py => google_maps_settings/test_google_maps_settings.py} (76%)
mode change 100644 => 100755
mode change 100644 => 100755 frappe/patches.txt
create mode 100755 frappe/patches/v11_0/rename_google_maps_doctype.py
diff --git a/frappe/config/integrations.py b/frappe/config/integrations.py
old mode 100644
new mode 100755
index d2f6453a53..cd065e53f2
--- a/frappe/config/integrations.py
+++ b/frappe/config/integrations.py
@@ -89,7 +89,7 @@ def get_data():
"items": [
{
"type": "doctype",
- "name": "Google Maps",
+ "name": "Google Maps Settings",
"description": _("Google Maps integration"),
},
{
diff --git a/frappe/integrations/doctype/google_maps/google_maps.py b/frappe/integrations/doctype/google_maps/google_maps.py
deleted file mode 100644
index d7b278e4c2..0000000000
--- a/frappe/integrations/doctype/google_maps/google_maps.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright (c) 2017, Frappe Technologies and contributors
-# For license information, please see license.txt
-
-from __future__ import unicode_literals
-import frappe
-from frappe import _
-from frappe.model.document import Document
-import datetime
-
-class GoogleMaps(Document):
- def validate(self):
- if self.enabled:
- if not self.client_key:
- frappe.throw(_("Client key is required"))
- if not self.home_address:
- frappe.throw(_("Home Address is required"))
-
-def round_timedelta(td, period):
- """Round timedelta"""
- period_seconds = period.total_seconds()
- half_period_seconds = period_seconds / 2
- remainder = td.total_seconds() % period_seconds
- if remainder >= half_period_seconds:
- return datetime.timedelta(seconds=td.total_seconds() + (period_seconds - remainder))
- else:
- return datetime.timedelta(seconds=td.total_seconds() - remainder)
-
-def format_address(address):
- """Customer Address format """
- address = frappe.get_doc('Address', address)
- return '{}, {}, {}, {}'.format(address.address_line1, address.city, address.pincode, address.country)
diff --git a/frappe/integrations/doctype/google_maps/__init__.py b/frappe/integrations/doctype/google_maps_settings/__init__.py
similarity index 100%
rename from frappe/integrations/doctype/google_maps/__init__.py
rename to frappe/integrations/doctype/google_maps_settings/__init__.py
diff --git a/frappe/integrations/doctype/google_maps/google_maps.js b/frappe/integrations/doctype/google_maps_settings/google_maps_settings.js
old mode 100644
new mode 100755
similarity index 72%
rename from frappe/integrations/doctype/google_maps/google_maps.js
rename to frappe/integrations/doctype/google_maps_settings/google_maps_settings.js
index 2205b9c05b..ef98ce2c47
--- a/frappe/integrations/doctype/google_maps/google_maps.js
+++ b/frappe/integrations/doctype/google_maps_settings/google_maps_settings.js
@@ -1,5 +1,5 @@
// Copyright (c) 2017, Frappe Technologies and contributors
// For license information, please see license.txt
-frappe.ui.form.on('Google Maps', {
+frappe.ui.form.on('Google Maps Settings', {
});
diff --git a/frappe/integrations/doctype/google_maps/google_maps.json b/frappe/integrations/doctype/google_maps_settings/google_maps_settings.json
similarity index 90%
rename from frappe/integrations/doctype/google_maps/google_maps.json
rename to frappe/integrations/doctype/google_maps_settings/google_maps_settings.json
index 4b9a3f6411..7a0695906e 100644
--- a/frappe/integrations/doctype/google_maps/google_maps.json
+++ b/frappe/integrations/doctype/google_maps_settings/google_maps_settings.json
@@ -14,6 +14,7 @@
"fields": [
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -40,10 +41,12 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -70,16 +73,18 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "home_address",
- "fieldtype": "Data",
+ "fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
@@ -90,6 +95,7 @@
"label": "Home Address",
"length": 0,
"no_copy": 0,
+ "options": "Address",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -100,6 +106,7 @@
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
}
],
@@ -113,16 +120,15 @@
"issingle": 1,
"istable": 0,
"max_attachments": 0,
- "modified": "2017-10-16 17:13:05.684227",
+ "modified": "2018-08-21 14:53:09.170463",
"modified_by": "Administrator",
"module": "Integrations",
- "name": "Google Maps",
+ "name": "Google Maps Settings",
"name_case": "",
"owner": "Administrator",
"permissions": [
{
"amend": 0,
- "apply_user_permissions": 0,
"cancel": 0,
"create": 1,
"delete": 1,
@@ -148,5 +154,6 @@
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
- "track_seen": 0
+ "track_seen": 0,
+ "track_views": 0
}
\ No newline at end of file
diff --git a/frappe/integrations/doctype/google_maps_settings/google_maps_settings.py b/frappe/integrations/doctype/google_maps_settings/google_maps_settings.py
new file mode 100755
index 0000000000..d11d782be2
--- /dev/null
+++ b/frappe/integrations/doctype/google_maps_settings/google_maps_settings.py
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2017, Frappe Technologies and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe import _
+from frappe.model.document import Document
+import googlemaps
+
+
+class GoogleMapsSettings(Document):
+ def validate(self):
+ if self.enabled:
+ if not self.client_key:
+ frappe.throw(_("Client key is required"))
+ if not self.home_address:
+ frappe.throw(_("Home Address is required"))
+
+ def get_client(self):
+ try:
+ client = googlemaps.Client(key=self.client_key)
+ except Exception as e:
+ frappe.throw(e.message)
+
+ return client
\ No newline at end of file
diff --git a/frappe/integrations/doctype/google_maps/test_google_maps.js b/frappe/integrations/doctype/google_maps_settings/test_google_maps_settings.js
old mode 100644
new mode 100755
similarity index 76%
rename from frappe/integrations/doctype/google_maps/test_google_maps.js
rename to frappe/integrations/doctype/google_maps_settings/test_google_maps_settings.js
index ff6a8d88a5..a3c72bc42a
--- a/frappe/integrations/doctype/google_maps/test_google_maps.js
+++ b/frappe/integrations/doctype/google_maps_settings/test_google_maps_settings.js
@@ -2,7 +2,7 @@
// rename this file from _test_[name] to test_[name] to activate
// and remove above this line
-QUnit.test("test: Google Maps", function (assert) {
+QUnit.test("test: Google Maps Settings", function (assert) {
let done = assert.async();
// number of asserts
@@ -10,7 +10,7 @@ QUnit.test("test: Google Maps", function (assert) {
frappe.run_serially([
// insert a new Google Maps
- () => frappe.tests.make('Google Maps', [
+ () => frappe.tests.make('Google Maps Settings', [
// values to be set
{key: 'value'}
]),
diff --git a/frappe/integrations/doctype/google_maps/test_google_maps.py b/frappe/integrations/doctype/google_maps_settings/test_google_maps_settings.py
old mode 100644
new mode 100755
similarity index 76%
rename from frappe/integrations/doctype/google_maps/test_google_maps.py
rename to frappe/integrations/doctype/google_maps_settings/test_google_maps_settings.py
index 8fe158186d..f5717e19e0
--- a/frappe/integrations/doctype/google_maps/test_google_maps.py
+++ b/frappe/integrations/doctype/google_maps_settings/test_google_maps_settings.py
@@ -4,5 +4,5 @@
from __future__ import unicode_literals
import unittest
-class TestGoogleMaps(unittest.TestCase):
+class TestGoogleMapsSettings(unittest.TestCase):
pass
diff --git a/frappe/patches.txt b/frappe/patches.txt
old mode 100644
new mode 100755
index 2046dddf0f..edc41d714d
--- a/frappe/patches.txt
+++ b/frappe/patches.txt
@@ -223,3 +223,4 @@ frappe.patches.v11_0.replicate_old_user_permissions
frappe.patches.v11_0.set_dropbox_file_backup
frappe.patches.v11_0.get_docs_apps_if_not_present
frappe.patches.v10_0.set_default_locking_time
+frappe.patches.v11_0.rename_google_maps_doctype
\ No newline at end of file
diff --git a/frappe/patches/v11_0/rename_google_maps_doctype.py b/frappe/patches/v11_0/rename_google_maps_doctype.py
new file mode 100755
index 0000000000..1423cd70e4
--- /dev/null
+++ b/frappe/patches/v11_0/rename_google_maps_doctype.py
@@ -0,0 +1,7 @@
+import frappe
+from frappe.model.rename_doc import rename_doc
+
+def execute():
+ if frappe.db.exists("DocType","Google Maps") and not frappe.db.exists("DocType","Google Maps Settings"):
+ rename_doc('DocType', 'Google Maps', 'Google Maps Settings')
+ frappe.reload_doc('integrations', 'doctype', 'google_maps_settings')
\ No newline at end of file
From ad9ce8a3a31551fb621f2c0ba39bd7a7ab7856f1 Mon Sep 17 00:00:00 2001
From: Rushabh Mehta
Date: Mon, 27 Aug 2018 11:20:10 +0530
Subject: [PATCH 26/56] fix(test): test_scheduler.py
---
frappe/tests/test_scheduler.py | 2 +-
frappe/utils/scheduler.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/frappe/tests/test_scheduler.py b/frappe/tests/test_scheduler.py
index 4ca5feaa29..6353f27c99 100644
--- a/frappe/tests/test_scheduler.py
+++ b/frappe/tests/test_scheduler.py
@@ -43,7 +43,7 @@ class TestScheduler(TestCase):
self.assertTrue("all" in frappe.flags.ran_schedulers)
self.assertTrue("hourly" in frappe.flags.ran_schedulers)
- del frappe.flags['enabled_events']
+ frappe.flags.enabled_events = None
def test_enabled_events_day_change(self):
val = json.dumps(["daily", "daily_long", "weekly", "weekly_long", "monthly", "monthly_long"])
diff --git a/frappe/utils/scheduler.py b/frappe/utils/scheduler.py
index f0eb513eb8..8e7a834512 100755
--- a/frappe/utils/scheduler.py
+++ b/frappe/utils/scheduler.py
@@ -214,7 +214,7 @@ def log(method, message=None):
return message
def get_enabled_scheduler_events():
- if 'enabled_events' in frappe.flags:
+ if 'enabled_events' in frappe.flags and frappe.flags.enabled_events:
return frappe.flags.enabled_events
enabled_events = frappe.db.get_global("enabled_scheduler_events")
From fcb28d36eeec3bff900f89815eda346fdca5314b Mon Sep 17 00:00:00 2001
From: Ameya Shenoy
Date: Mon, 27 Aug 2018 10:50:37 +0000
Subject: [PATCH 27/56] Reverting file permissions (#6012)
---
frappe/config/integrations.py | 0
.../doctype/google_maps_settings/google_maps_settings.js | 0
.../doctype/google_maps_settings/google_maps_settings.py | 0
.../doctype/google_maps_settings/test_google_maps_settings.js | 0
.../doctype/google_maps_settings/test_google_maps_settings.py | 0
frappe/patches.txt | 0
frappe/patches/v11_0/rename_google_maps_doctype.py | 0
7 files changed, 0 insertions(+), 0 deletions(-)
mode change 100755 => 100644 frappe/config/integrations.py
mode change 100755 => 100644 frappe/integrations/doctype/google_maps_settings/google_maps_settings.js
mode change 100755 => 100644 frappe/integrations/doctype/google_maps_settings/google_maps_settings.py
mode change 100755 => 100644 frappe/integrations/doctype/google_maps_settings/test_google_maps_settings.js
mode change 100755 => 100644 frappe/integrations/doctype/google_maps_settings/test_google_maps_settings.py
mode change 100755 => 100644 frappe/patches.txt
mode change 100755 => 100644 frappe/patches/v11_0/rename_google_maps_doctype.py
diff --git a/frappe/config/integrations.py b/frappe/config/integrations.py
old mode 100755
new mode 100644
diff --git a/frappe/integrations/doctype/google_maps_settings/google_maps_settings.js b/frappe/integrations/doctype/google_maps_settings/google_maps_settings.js
old mode 100755
new mode 100644
diff --git a/frappe/integrations/doctype/google_maps_settings/google_maps_settings.py b/frappe/integrations/doctype/google_maps_settings/google_maps_settings.py
old mode 100755
new mode 100644
diff --git a/frappe/integrations/doctype/google_maps_settings/test_google_maps_settings.js b/frappe/integrations/doctype/google_maps_settings/test_google_maps_settings.js
old mode 100755
new mode 100644
diff --git a/frappe/integrations/doctype/google_maps_settings/test_google_maps_settings.py b/frappe/integrations/doctype/google_maps_settings/test_google_maps_settings.py
old mode 100755
new mode 100644
diff --git a/frappe/patches.txt b/frappe/patches.txt
old mode 100755
new mode 100644
diff --git a/frappe/patches/v11_0/rename_google_maps_doctype.py b/frappe/patches/v11_0/rename_google_maps_doctype.py
old mode 100755
new mode 100644
From 6ebc9581fc78c37a693ce489a6282cf090815b7a Mon Sep 17 00:00:00 2001
From: Ameya Shenoy
Date: Mon, 27 Aug 2018 14:47:35 +0530
Subject: [PATCH 28/56] grid_list: fixed event binding on paging
---
frappe/website/js/grid_list.js | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/frappe/website/js/grid_list.js b/frappe/website/js/grid_list.js
index 825d1f5d1a..5c8e3c363c 100644
--- a/frappe/website/js/grid_list.js
+++ b/frappe/website/js/grid_list.js
@@ -49,7 +49,8 @@ export default function make_datatable(container, doctype) {
tablerow
.css({cursor: 'pointer'})
- .click(() => {
+ .click((e) => {
+ if ($(e.target).is('[type=checkbox]')) return
window.location.href = window.location.href + '?name=' + data[i].name;
});
for (let fieldname of colnames) {
@@ -62,7 +63,7 @@ export default function make_datatable(container, doctype) {
const bind_events = () => {
- parent.find('input[type="checkbox"]:not(.select-all)').on('click', (e) => {
+ parent.on('click', 'input[type="checkbox"]:not(.select-all)', (e) => {
set_actions();
e.stopPropagation();
});
From 99b102dc25193d7cc5ce30fed39f7ae398833a54 Mon Sep 17 00:00:00 2001
From: Saurabh
Date: Mon, 27 Aug 2018 17:01:55 +0530
Subject: [PATCH 29/56] [fix] v11 patch fixes
---
frappe/core/doctype/user/user.py | 4 ++--
frappe/patches/v11_0/create_contact_for_user.py | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py
index be99c7f06b..41ead28444 100644
--- a/frappe/core/doctype/user/user.py
+++ b/frappe/core/doctype/user/user.py
@@ -1039,7 +1039,7 @@ def update_roles(role_profile):
user.set('roles', [])
user.add_roles(*roles)
-def create_contact(user):
+def create_contact(user, ignore_links=False):
if user.name in ["Administrator", "Guest"]: return
if not frappe.db.get_value("Contact", {"email_id": user.email}):
@@ -1052,7 +1052,7 @@ def create_contact(user):
"gender": user.gender,
"phone": user.phone,
"mobile_no": user.mobile_no
- }).insert(ignore_permissions=True)
+ }).insert(ignore_permissions=True, ignore_links=ignore_links)
@frappe.whitelist()
diff --git a/frappe/patches/v11_0/create_contact_for_user.py b/frappe/patches/v11_0/create_contact_for_user.py
index d584fc939e..e41d6d1b0a 100644
--- a/frappe/patches/v11_0/create_contact_for_user.py
+++ b/frappe/patches/v11_0/create_contact_for_user.py
@@ -13,4 +13,4 @@ def execute():
user.first_name = re.sub("[<>]+", '', frappe.safe_decode(user.first_name))
if user.last_name:
user.last_name = re.sub("[<>]+", '', frappe.safe_decode(user.last_name))
- create_contact(user)
+ create_contact(user, ignore_links=True)
From d3be20047d230864eeaea70a24397b25c882f576 Mon Sep 17 00:00:00 2001
From: Rushabh Mehta
Date: Tue, 28 Aug 2018 14:57:05 +0530
Subject: [PATCH 30/56] ux(filters): dont validate in list filters
---
frappe/public/js/frappe/ui/base_list.js | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/frappe/public/js/frappe/ui/base_list.js b/frappe/public/js/frappe/ui/base_list.js
index 3a239f5bc0..3e32d893a2 100644
--- a/frappe/public/js/frappe/ui/base_list.js
+++ b/frappe/public/js/frappe/ui/base_list.js
@@ -207,13 +207,20 @@ frappe.ui.BaseList = Class.extend({
fieldtype = 'Data';
condition = 'like';
}
- if(df.fieldtype == "Select" && df.options) {
+
+ if (df.fieldtype === "Select" && df.options) {
options = df.options.split("\n");
if(options.length > 0 && options[0] != "") {
options.unshift("");
options = options.join("\n");
}
}
+
+ if (df.fieldtype === 'Data' && df.options) {
+ // don't format email / number in filters
+ options = '';
+ }
+
let f = me.page.add_field({
fieldtype: fieldtype,
label: __(df.label),
From e88cbee727b496e9b94e7365c6cdfbb7618bda5a Mon Sep 17 00:00:00 2001
From: Saurabh
Date: Tue, 28 Aug 2018 15:23:05 +0530
Subject: [PATCH 31/56] add missing methods from google_maps to
google_maps_settings (#6020)
---
.../google_maps_settings.py | 19 +++++++++++++++++--
1 file changed, 17 insertions(+), 2 deletions(-)
diff --git a/frappe/integrations/doctype/google_maps_settings/google_maps_settings.py b/frappe/integrations/doctype/google_maps_settings/google_maps_settings.py
index d11d782be2..a4f61f500d 100644
--- a/frappe/integrations/doctype/google_maps_settings/google_maps_settings.py
+++ b/frappe/integrations/doctype/google_maps_settings/google_maps_settings.py
@@ -7,7 +7,7 @@ import frappe
from frappe import _
from frappe.model.document import Document
import googlemaps
-
+import datetime
class GoogleMapsSettings(Document):
def validate(self):
@@ -23,4 +23,19 @@ class GoogleMapsSettings(Document):
except Exception as e:
frappe.throw(e.message)
- return client
\ No newline at end of file
+ return client
+
+def round_timedelta(td, period):
+ """Round timedelta"""
+ period_seconds = period.total_seconds()
+ half_period_seconds = period_seconds / 2
+ remainder = td.total_seconds() % period_seconds
+ if remainder >= half_period_seconds:
+ return datetime.timedelta(seconds=td.total_seconds() + (period_seconds - remainder))
+ else:
+ return datetime.timedelta(seconds=td.total_seconds() - remainder)
+
+def format_address(address):
+ """Customer Address format """
+ address = frappe.get_doc('Address', address)
+ return '{}, {}, {}, {}'.format(address.address_line1, address.city, address.pincode, address.country)
From 7362a0151f3369a235eeef823014fbb9b586644c Mon Sep 17 00:00:00 2001
From: Rushabh Mehta
Date: Tue, 28 Aug 2018 15:29:27 +0530
Subject: [PATCH 32/56] ux(timeline): different background for comment (#6021)
---
frappe/public/js/frappe/form/footer/timeline_item.html | 2 +-
frappe/public/less/form.less | 6 ++++++
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/frappe/public/js/frappe/form/footer/timeline_item.html b/frappe/public/js/frappe/form/footer/timeline_item.html
index b4f925eeb2..54d1a34d47 100755
--- a/frappe/public/js/frappe/form/footer/timeline_item.html
+++ b/frappe/public/js/frappe/form/footer/timeline_item.html
@@ -1,4 +1,4 @@
-
+
{% if (data.user_content) { %}
{% if(data.user_info.image) { %}
diff --git a/frappe/public/less/form.less b/frappe/public/less/form.less
index d860c4ffa7..ef8d0841a4 100644
--- a/frappe/public/less/form.less
+++ b/frappe/public/less/form.less
@@ -352,6 +352,12 @@ h6.uppercase, .h6.uppercase {
}
}
+.timeline-item[data-communication-type="Comment"] {
+ .reply {
+ background-color: @light-yellow;
+ }
+}
+
.timeline-items {
position: relative;
}
From f3b959b1fe89fb4ea66e88b3f600c9869da791d5 Mon Sep 17 00:00:00 2001
From: Aditya Hase
Date: Tue, 28 Aug 2018 15:31:20 +0530
Subject: [PATCH 33/56] frappe: refactor async to realtime (#6015)
* frappe: refactor async to realtime
* frappe: refactor async to is_async
---
frappe/__init__.py | 10 +++++-----
frappe/app.py | 1 -
frappe/core/doctype/data_import/importer.py | 1 -
frappe/database.py | 3 +--
frappe/handler.py | 1 -
frappe/hooks.py | 2 +-
frappe/{async.py => realtime.py} | 0
frappe/utils/background_jobs.py | 2 +-
socketio.js | 4 ++--
9 files changed, 10 insertions(+), 14 deletions(-)
rename frappe/{async.py => realtime.py} (100%)
diff --git a/frappe/__init__.py b/frappe/__init__.py
index 673c0521b8..f6a8b5c2b6 100644
--- a/frappe/__init__.py
+++ b/frappe/__init__.py
@@ -339,7 +339,7 @@ def throw(msg, exc=ValidationError, title=None):
msgprint(msg, raise_exception=exc, title=title, indicator='red')
def emit_js(js, user=False, **kwargs):
- from frappe.async import publish_realtime
+ from frappe.realtime import publish_realtime
if user == False:
user = session.user
publish_realtime('eval_js', js, user=user, **kwargs)
@@ -1376,8 +1376,8 @@ def publish_progress(*args, **kwargs):
:param doctype: Optional, for DocType
:param name: Optional, for Document name
"""
- import frappe.async
- return frappe.async.publish_progress(*args, **kwargs)
+ import frappe.realtime
+ return frappe.realtime.publish_progress(*args, **kwargs)
def publish_realtime(*args, **kwargs):
"""Publish real-time updates
@@ -1390,9 +1390,9 @@ def publish_realtime(*args, **kwargs):
:param docname: Transmit to doctype, docname
:param after_commit: (default False) will emit after current transaction is committed
"""
- import frappe.async
+ import frappe.realtime
- return frappe.async.publish_realtime(*args, **kwargs)
+ return frappe.realtime.publish_realtime(*args, **kwargs)
def local_cache(namespace, key, generator, regenerate_if_none=False):
"""A key value store for caching within a request
diff --git a/frappe/app.py b/frappe/app.py
index ea346a0417..d07c42dff2 100644
--- a/frappe/app.py
+++ b/frappe/app.py
@@ -17,7 +17,6 @@ import frappe
import frappe.handler
import frappe.auth
import frappe.api
-import frappe.async
import frappe.utils.response
import frappe.website.render
from frappe.utils import get_site_name
diff --git a/frappe/core/doctype/data_import/importer.py b/frappe/core/doctype/data_import/importer.py
index c5b8c1a94b..299eb1de9d 100644
--- a/frappe/core/doctype/data_import/importer.py
+++ b/frappe/core/doctype/data_import/importer.py
@@ -7,7 +7,6 @@ from six.moves import range
import requests
import frappe, json, os
import frappe.permissions
-import frappe.async
from frappe import _
diff --git a/frappe/database.py b/frappe/database.py
index 14a61b22b7..bbfe6ad40a 100644
--- a/frappe/database.py
+++ b/frappe/database.py
@@ -9,7 +9,6 @@ import warnings
import datetime
import frappe
import frappe.defaults
-import frappe.async
from time import time
import re
import frappe.model.meta
@@ -813,7 +812,7 @@ class Database:
def flush_realtime_log(self):
for args in frappe.local.realtime_log:
- frappe.async.emit_via_redis(*args)
+ frappe.realtime.emit_via_redis(*args)
frappe.local.realtime_log = []
diff --git a/frappe/handler.py b/frappe/handler.py
index db95ad4a96..16138edf62 100755
--- a/frappe/handler.py
+++ b/frappe/handler.py
@@ -5,7 +5,6 @@ from __future__ import unicode_literals
import frappe
from frappe import _
import frappe.utils
-import frappe.async
import frappe.sessions
import frappe.utils.file_manager
import frappe.desk.form.run_method
diff --git a/frappe/hooks.py b/frappe/hooks.py
index 91c9be3af7..a0390663b5 100755
--- a/frappe/hooks.py
+++ b/frappe/hooks.py
@@ -162,7 +162,7 @@ scheduler_events = {
"frappe.desk.doctype.event.event.send_event_digest",
"frappe.sessions.clear_expired_sessions",
"frappe.email.doctype.notification.notification.trigger_daily_alerts",
- "frappe.async.remove_old_task_logs",
+ "frappe.realtime.remove_old_task_logs",
"frappe.utils.scheduler.disable_scheduler_on_expiry",
"frappe.utils.scheduler.restrict_scheduler_events_if_dormant",
"frappe.email.doctype.auto_email_report.auto_email_report.send_daily",
diff --git a/frappe/async.py b/frappe/realtime.py
similarity index 100%
rename from frappe/async.py
rename to frappe/realtime.py
diff --git a/frappe/utils/background_jobs.py b/frappe/utils/background_jobs.py
index 9f75b1b744..fc59c8dc7f 100755
--- a/frappe/utils/background_jobs.py
+++ b/frappe/utils/background_jobs.py
@@ -202,7 +202,7 @@ def get_queue(queue, is_async=True):
'''Returns a Queue object tied to a redis connection'''
validate_queue(queue)
- return Queue(queue, connection=get_redis_conn(), async=is_async)
+ return Queue(queue, connection=get_redis_conn(), is_async=is_async)
def validate_queue(queue, default_queue_list=None):
if not default_queue_list:
diff --git a/socketio.js b/socketio.js
index 5fcbf46785..6e6a841acc 100644
--- a/socketio.js
+++ b/socketio.js
@@ -72,7 +72,7 @@ io.on('connection', function (socket) {
});
// end frappe.chat
- request.get(get_url(socket, '/api/method/frappe.async.get_user_info'))
+ request.get(get_url(socket, '/api/method/frappe.realtime.get_user_info'))
.type('form')
.query({
sid: sid
@@ -291,7 +291,7 @@ function get_url(socket, path) {
function can_subscribe_doc(args) {
if (!args) return;
if (!args.doctype || !args.docname) return;
- request.get(get_url(args.socket, '/api/method/frappe.async.can_subscribe_doc'))
+ request.get(get_url(args.socket, '/api/method/frappe.realtime.can_subscribe_doc'))
.type('form')
.query({
sid: args.sid,
From d8b3fcb34761af01e87026e3bc5b929bd6b68fc2 Mon Sep 17 00:00:00 2001
From: Nabin Hait
Date: Tue, 28 Aug 2018 16:15:10 +0530
Subject: [PATCH 34/56] [fix] Rename property setter for fetch_from
---
frappe/patches/v11_0/copy_fetch_data_from_options.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/frappe/patches/v11_0/copy_fetch_data_from_options.py b/frappe/patches/v11_0/copy_fetch_data_from_options.py
index 18057cae02..4c69a75c55 100644
--- a/frappe/patches/v11_0/copy_fetch_data_from_options.py
+++ b/frappe/patches/v11_0/copy_fetch_data_from_options.py
@@ -24,8 +24,8 @@ def execute():
frappe.db.sql('''
update `tabProperty Setter`
- set property="fetch_from"
+ set property="fetch_from", name=concat(doc_type, '-', field_name, '-', property)
where property="options" and value like '%.%'
and property_type in ('Data', 'Read Only', 'Text', 'Small Text', 'Text Editor', 'Code', 'Link', 'Check')
and field_name!='naming_series'
- ''')
+ ''')
\ No newline at end of file
From f379e2fe7f7d650c255206712abf3f54d187a12d Mon Sep 17 00:00:00 2001
From: Ameya Shenoy
Date: Tue, 28 Aug 2018 11:04:50 +0000
Subject: [PATCH 35/56] rq: lock version 0.12.0
---
requirements.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requirements.txt b/requirements.txt
index 3144d9de7b..973bc69ecf 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -26,7 +26,7 @@ bleach
bleach-whitelist
Pillow
beautifulsoup4
-rq
+rq==0.12.0
schedule
cryptography
pyopenssl
From 116a0bc99c2fd5ca7060e2608d363d83036a09f2 Mon Sep 17 00:00:00 2001
From: Faris Ansari
Date: Tue, 28 Aug 2018 18:45:56 +0530
Subject: [PATCH 36/56] fix(async): Pass async param using dict
---
frappe/utils/background_jobs.py | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/frappe/utils/background_jobs.py b/frappe/utils/background_jobs.py
index 9f75b1b744..daaed29cc5 100755
--- a/frappe/utils/background_jobs.py
+++ b/frappe/utils/background_jobs.py
@@ -202,7 +202,12 @@ def get_queue(queue, is_async=True):
'''Returns a Queue object tied to a redis connection'''
validate_queue(queue)
- return Queue(queue, connection=get_redis_conn(), async=is_async)
+ kwargs = {
+ 'connection': get_redis_conn(),
+ 'async': is_async
+ }
+
+ return Queue(queue, **kwargs)
def validate_queue(queue, default_queue_list=None):
if not default_queue_list:
From 2b672d2ee75ca106badd4a6dadb65126afcfbd72 Mon Sep 17 00:00:00 2001
From: Prateeksha Singh
Date: Wed, 29 Aug 2018 12:03:27 +0530
Subject: [PATCH 37/56] Add Vue Support (#6025)
* [frappe][build] Add Vue
* chore(rollup): add node_modules path for all apps
- also remove rollup-plugin-alias
* feat: Add EventEmitter
Usage:
```
frappe.utils.make_event_emitter(obj);
obj.trigger('event');
obj.on('event', fn);
```
* chore: Update rollup
* fix: add comment_when to frappe.datetime
* feat: Add img-loading class
* feat: Add .vue files for translation extraction
* [frappe][build] Add Vue
* chore(rollup): add node_modules path for all apps
- also remove rollup-plugin-alias
* feat: Add EventEmitter
Usage:
```
frappe.utils.make_event_emitter(obj);
obj.trigger('event');
obj.on('event', fn);
```
* chore: Update rollup
* fix: add comment_when to frappe.datetime
* feat: Add img-loading class
---
frappe/public/build.json | 1 +
frappe/public/js/frappe/event_emitter.js | 36 ++++
frappe/public/js/frappe/misc/pretty_date.js | 3 +-
frappe/public/js/frappe/router.js | 3 +
frappe/public/less/desk.less | 22 ++-
frappe/translate.py | 3 +-
package.json | 9 +-
rollup/config.js | 13 +-
yarn.lock | 198 ++++++++++++++++++--
9 files changed, 267 insertions(+), 21 deletions(-)
create mode 100644 frappe/public/js/frappe/event_emitter.js
diff --git a/frappe/public/build.json b/frappe/public/build.json
index 8ded4bd981..25fae164d5 100755
--- a/frappe/public/build.json
+++ b/frappe/public/build.json
@@ -150,6 +150,7 @@
"public/js/frappe/format.js",
"public/js/frappe/form/formatters.js",
"public/js/frappe/dom.js",
+ "public/js/frappe/event_emitter.js",
"public/js/frappe/ui/messages.js",
"public/js/frappe/ui/keyboard.js",
"public/js/frappe/ui/colors.js",
diff --git a/frappe/public/js/frappe/event_emitter.js b/frappe/public/js/frappe/event_emitter.js
new file mode 100644
index 0000000000..4b6ccb240e
--- /dev/null
+++ b/frappe/public/js/frappe/event_emitter.js
@@ -0,0 +1,36 @@
+frappe.provide('frappe.utils');
+/**
+ * Simple EventEmitter which uses jQuery's event system
+ */
+class EventEmitter {
+ init() {
+ this.jq = jQuery(this);
+ }
+
+ trigger(evt, data) {
+ !this.jq && this.init();
+ this.jq.trigger(evt, data);
+ }
+
+ once(evt, handler) {
+ !this.jq && this.init();
+ this.jq.one(evt, (e, data) => handler(data));
+ }
+
+ on(evt, handler) {
+ !this.jq && this.init();
+ this.jq.bind(evt, (e, data) => handler(data));
+ }
+
+ off(evt, handler) {
+ !this.jq && this.init();
+ this.jq.unbind(evt, (e, data) => handler(data));
+ }
+}
+
+frappe.utils.make_event_emitter = function(object) {
+ Object.assign(object, EventEmitter.prototype);
+ return object;
+}
+
+export default EventEmitter;
\ No newline at end of file
diff --git a/frappe/public/js/frappe/misc/pretty_date.js b/frappe/public/js/frappe/misc/pretty_date.js
index 52a791c089..aef95fc953 100644
--- a/frappe/public/js/frappe/misc/pretty_date.js
+++ b/frappe/public/js/frappe/misc/pretty_date.js
@@ -59,6 +59,7 @@ function prettyDate(time, mini) {
}
+frappe.provide("frappe.datetime");
window.comment_when = function(datetime, mini) {
var timestamp = frappe.datetime.str_to_user ?
frappe.datetime.str_to_user(datetime) : datetime;
@@ -67,8 +68,8 @@ window.comment_when = function(datetime, mini) {
+ '" title="' + timestamp + '">'
+ prettyDate(datetime, mini) + '';
};
+frappe.datetime.comment_when = comment_when
-frappe.provide("frappe.datetime");
frappe.datetime.refresh_when = function() {
if (jQuery) {
$(".frappe-timestamp").each(function() {
diff --git a/frappe/public/js/frappe/router.js b/frappe/public/js/frappe/router.js
index 2ccbc119b4..dbf48ee2e3 100644
--- a/frappe/public/js/frappe/router.js
+++ b/frappe/public/js/frappe/router.js
@@ -177,4 +177,7 @@ $(window).on('hashchange', function() {
frappe.route();
+ frappe.route.trigger('change');
});
+
+frappe.utils.make_event_emitter(frappe.route);
diff --git a/frappe/public/less/desk.less b/frappe/public/less/desk.less
index f27c376776..b9d35adb44 100644
--- a/frappe/public/less/desk.less
+++ b/frappe/public/less/desk.less
@@ -1159,7 +1159,7 @@ img.no-image {
width: 100%;
}
-img.no-image:before {
+.img-background() {
content: " ";
display: block;
position: absolute;
@@ -1169,7 +1169,7 @@ img.no-image:before {
background-color: @light-bg;
}
-img.no-image:after {
+.img-foreground() {
content: "\f1c5";
display: block;
font-style: normal;
@@ -1183,4 +1183,22 @@ img.no-image:after {
left: 0;
width: 100%;
text-align: center;
+}
+
+img.no-image:before {
+ .img-background();
+}
+
+img.no-image:after {
+ .img-foreground();
+}
+
+img.img-loading:before {
+ .img-background();
+}
+
+img.img-loading:after {
+ .img-foreground();
+ font-family: 'Octicons';
+ content: "\f00b";
}
\ No newline at end of file
diff --git a/frappe/translate.py b/frappe/translate.py
index 6542424354..800aa85f01 100644
--- a/frappe/translate.py
+++ b/frappe/translate.py
@@ -452,13 +452,14 @@ def get_server_messages(app):
"""Extracts all translatable strings (tagged with :func:`frappe._`) from Python modules
inside an app"""
messages = []
+ file_extensions = ('.py', '.html', '.js', '.vue')
for basepath, folders, files in os.walk(frappe.get_pymodule_path(app)):
for dontwalk in (".git", "public", "locale"):
if dontwalk in folders: folders.remove(dontwalk)
for f in files:
f = frappe.as_unicode(f)
- if f.endswith(".py") or f.endswith(".html") or f.endswith(".js"):
+ if f.endswith(file_extensions):
messages.extend(get_messages_from_file(os.path.join(basepath, f)))
return messages
diff --git a/package.json b/package.json
index 554bb2a1fd..38f860ddea 100644
--- a/package.json
+++ b/package.json
@@ -30,19 +30,22 @@
"showdown": "^1.8.6",
"socket.io": "^2.0.4",
"superagent": "^3.8.2",
- "touch": "^3.1.0"
+ "touch": "^3.1.0",
+ "vue": "^2.5.17"
},
"devDependencies": {
"babel-runtime": "^6.26.0",
"chalk": "^2.3.2",
"less": "^3.0.4",
"node-sass": "^4.9.0",
- "rollup": "^0.55.3",
+ "rollup": "^0.65.0",
"rollup-plugin-buble": "^0.19.2",
"rollup-plugin-commonjs": "^8.3.0",
"rollup-plugin-multi-entry": "^2.0.2",
"rollup-plugin-node-resolve": "^3.0.2",
"rollup-plugin-postcss": "^1.4.0",
- "rollup-plugin-uglify": "^3.0.0"
+ "rollup-plugin-uglify": "^3.0.0",
+ "rollup-plugin-vue": "^4.3.2",
+ "vue-template-compiler": "^2.5.17"
}
}
diff --git a/rollup/config.js b/rollup/config.js
index d3e96f1fab..a25039f1f5 100644
--- a/rollup/config.js
+++ b/rollup/config.js
@@ -1,4 +1,5 @@
const path = require('path');
+const fs = require('fs');
const chalk = require('chalk');
const log = console.log; // eslint-disable-line
@@ -8,11 +9,13 @@ const node_resolve = require('rollup-plugin-node-resolve');
const postcss = require('rollup-plugin-postcss');
const buble = require('rollup-plugin-buble');
const uglify = require('rollup-plugin-uglify');
+const vue = require('rollup-plugin-vue');
const frappe_html = require('./frappe-html-plugin');
const production = process.env.FRAPPE_ENV === 'production';
const {
+ apps_list,
assets_path,
bench_path,
get_public_path,
@@ -35,6 +38,8 @@ function get_rollup_options_for_js(output_file, input_files) {
multi_entry(),
// .html -> .js
frappe_html(),
+ // .vue -> .js
+ vue.default(),
// ES6 -> ES5
buble({
objectAssign: 'Object.assign',
@@ -44,7 +49,13 @@ function get_rollup_options_for_js(output_file, input_files) {
exclude: [path.resolve(bench_path, '**/*.css'), path.resolve(bench_path, '**/*.less')]
}),
commonjs(),
- node_resolve(),
+ node_resolve({
+ customResolveOptions: {
+ paths: apps_list.map(app => {
+ return path.resolve(get_app_path(app), '../node_modules')
+ }).filter(fs.existsSync)
+ }
+ }),
production && uglify()
];
diff --git a/yarn.lock b/yarn.lock
index 38cd12b37b..30d4f2bf05 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,6 +2,44 @@
# yarn lockfile v1
+"@babel/runtime@^7.0.0-beta.46":
+ version "7.0.0-rc.2"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-rc.2.tgz#63082909bd27c39f92c27c641f278389ad30a478"
+ dependencies:
+ regenerator-runtime "^0.12.0"
+
+"@types/estree@0.0.39":
+ version "0.0.39"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
+
+"@types/node@*":
+ version "10.9.2"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.9.2.tgz#f0ab8dced5cd6c56b26765e1c0d9e4fdcc9f2a00"
+
+"@vue/component-compiler-utils@^2.1.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-2.2.0.tgz#bbbb7ed38a9a8a7c93abe7ef2e54a90a04b631b4"
+ dependencies:
+ consolidate "^0.15.1"
+ hash-sum "^1.0.2"
+ lru-cache "^4.1.2"
+ merge-source-map "^1.1.0"
+ postcss "^6.0.20"
+ postcss-selector-parser "^3.1.1"
+ prettier "1.13.7"
+ source-map "^0.5.6"
+ vue-template-es2015-compiler "^1.6.0"
+
+"@vue/component-compiler@^3.4.4":
+ version "3.4.4"
+ resolved "https://registry.yarnpkg.com/@vue/component-compiler/-/component-compiler-3.4.4.tgz#4bec11116116c292f1f865afc2d88421953fc393"
+ dependencies:
+ "@vue/component-compiler-utils" "^2.1.0"
+ clean-css "^4.1.11"
+ hash-sum "^1.0.2"
+ postcss-modules-sync "^1.0.0"
+ source-map "0.6.*"
+
abbrev@1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
@@ -233,6 +271,10 @@ block-stream@*:
dependencies:
inherits "~2.0.0"
+bluebird@^3.1.1:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
+
body-parser@1.18.2:
version "1.18.2"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
@@ -367,12 +409,26 @@ chalk@^2.3.1:
escape-string-regexp "^1.0.5"
supports-color "^5.2.0"
+chalk@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
clap@^1.0.9:
version "1.2.3"
resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51"
dependencies:
chalk "^1.1.3"
+clean-css@^4.1.11:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17"
+ dependencies:
+ source-map "~0.6.0"
+
cliui@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
@@ -487,6 +543,12 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+consolidate@^0.15.1:
+ version "0.15.1"
+ resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7"
+ dependencies:
+ bluebird "^3.1.1"
+
content-disposition@0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
@@ -631,7 +693,11 @@ dashdash@^1.12.0:
dependencies:
assert-plus "^1.0.0"
-debug@2.6.9, debug@~2.6.4, debug@~2.6.6:
+de-indent@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
+
+debug@2.6.9, debug@^2.6.0, debug@~2.6.4, debug@~2.6.6:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
dependencies:
@@ -671,6 +737,12 @@ destroy@~1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+dot-prop@^4.1.1:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
+ dependencies:
+ is-obj "^1.0.0"
+
double-ended-queue@^2.1.0-0:
version "2.1.0-0"
resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c"
@@ -1178,6 +1250,10 @@ has@^1.0.1:
dependencies:
function-bind "^1.0.2"
+hash-sum@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04"
+
hawk@~3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
@@ -1187,6 +1263,10 @@ hawk@~3.1.3:
hoek "2.x.x"
sntp "1.x.x"
+he@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
+
highlight.js@^9.12.0:
version "9.12.0"
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e"
@@ -1238,7 +1318,7 @@ iconv-lite@0.4.19:
version "0.4.19"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
-icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0:
+icss-replace-symbols@1.1.0, icss-replace-symbols@^1.0.2, icss-replace-symbols@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
@@ -1391,6 +1471,10 @@ is-number@^3.0.0:
dependencies:
kind-of "^3.0.2"
+is-obj@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+
is-plain-obj@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
@@ -1629,6 +1713,13 @@ lru-cache@^4.0.1:
pseudomap "^1.0.2"
yallist "^2.1.2"
+lru-cache@^4.1.2:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
macaddress@^0.2.8:
version "0.2.8"
resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12"
@@ -1690,6 +1781,12 @@ merge-descriptors@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+merge-source-map@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646"
+ dependencies:
+ source-map "^0.6.1"
+
methods@^1.1.1, methods@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
@@ -2217,20 +2314,31 @@ postcss-modules-extract-imports@1.1.0:
dependencies:
postcss "^6.0.1"
-postcss-modules-local-by-default@1.2.0:
+postcss-modules-local-by-default@1.2.0, postcss-modules-local-by-default@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
dependencies:
css-selector-tokenizer "^0.7.0"
postcss "^6.0.1"
-postcss-modules-scope@1.1.0:
+postcss-modules-scope@1.1.0, postcss-modules-scope@^1.0.2:
version "1.1.0"
resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
dependencies:
css-selector-tokenizer "^0.7.0"
postcss "^6.0.1"
+postcss-modules-sync@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-sync/-/postcss-modules-sync-1.0.0.tgz#619a719cf78dd16a4834135140b324cf77334be1"
+ dependencies:
+ generic-names "^1.0.2"
+ icss-replace-symbols "^1.0.2"
+ postcss "^5.2.5"
+ postcss-modules-local-by-default "^1.1.1"
+ postcss-modules-scope "^1.0.2"
+ string-hash "^1.1.0"
+
postcss-modules-values@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
@@ -2298,6 +2406,14 @@ postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2:
indexes-of "^1.0.1"
uniq "^1.0.1"
+postcss-selector-parser@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865"
+ dependencies:
+ dot-prop "^4.1.1"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
postcss-svgo@^2.1.1:
version "2.1.6"
resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d"
@@ -2335,7 +2451,7 @@ postcss@6.0.1:
source-map "^0.5.6"
supports-color "^3.2.3"
-postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.8, postcss@^5.2.16:
+postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.8, postcss@^5.2.16, postcss@^5.2.5:
version "5.2.18"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5"
dependencies:
@@ -2352,6 +2468,14 @@ postcss@^6.0.1:
source-map "^0.6.1"
supports-color "^5.3.0"
+postcss@^6.0.20:
+ version "6.0.23"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
+ dependencies:
+ chalk "^2.4.1"
+ source-map "^0.6.1"
+ supports-color "^5.4.0"
+
prepend-http@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
@@ -2360,6 +2484,10 @@ preserve@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+prettier@1.13.7:
+ version "1.13.7"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.7.tgz#850f3b8af784a49a6ea2d2eaa7ed1428a34b7281"
+
process-nextick-args@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
@@ -2416,6 +2544,10 @@ query-string@^4.1.0:
object-assign "^4.1.0"
strict-uri-encode "^1.0.0"
+querystring@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
randomatic@^1.1.3:
version "1.1.7"
resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c"
@@ -2520,6 +2652,10 @@ regenerator-runtime@^0.11.0:
version "0.11.1"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+regenerator-runtime@^0.12.0:
+ version "0.12.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de"
+
regex-cache@^0.4.2:
version "0.4.4"
resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
@@ -2707,6 +2843,18 @@ rollup-plugin-uglify@^3.0.0:
dependencies:
uglify-es "^3.3.7"
+rollup-plugin-vue@^4.3.2:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-vue/-/rollup-plugin-vue-4.3.2.tgz#0bdf0cf677565b0ac2358d590f177b6b4ded8cce"
+ dependencies:
+ "@babel/runtime" "^7.0.0-beta.46"
+ "@vue/component-compiler" "^3.4.4"
+ "@vue/component-compiler-utils" "^2.1.0"
+ debug "^2.6.0"
+ hash-sum "^1.0.2"
+ querystring "^0.2.0"
+ rollup-pluginutils "^2.0.1"
+
rollup-pluginutils@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz#7ec95b3573f6543a46a6461bd9a7c544525d0fc0"
@@ -2714,9 +2862,12 @@ rollup-pluginutils@^2.0.1:
estree-walker "^0.3.0"
micromatch "^2.3.11"
-rollup@^0.55.3:
- version "0.55.5"
- resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.55.5.tgz#2f88c300f7cf24b5ec2dca8a6aba73b04e087e93"
+rollup@^0.65.0:
+ version "0.65.0"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.65.0.tgz#280db1252169b68fc3043028346b337dde453fba"
+ dependencies:
+ "@types/estree" "0.0.39"
+ "@types/node" "*"
safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.1"
@@ -2876,6 +3027,10 @@ sortablejs@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.7.0.tgz#80a2b2370abd568e1cec8c271131ef30a904fa28"
+source-map@0.6.*, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
source-map@^0.4.2:
version "0.4.4"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
@@ -2886,10 +3041,6 @@ source-map@^0.5.3, source-map@^0.5.6:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
-source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
-
spdx-correct@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82"
@@ -2944,7 +3095,7 @@ strict-uri-encode@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
-string-hash@^1.1.1:
+string-hash@^1.1.0, string-hash@^1.1.1:
version "1.1.3"
resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b"
@@ -3048,6 +3199,12 @@ supports-color@^5.3.0:
dependencies:
has-flag "^3.0.0"
+supports-color@^5.4.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ dependencies:
+ has-flag "^3.0.0"
+
svgo@^0.7.0:
version "0.7.2"
resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"
@@ -3201,6 +3358,21 @@ vlq@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.0.tgz#8101be90843422954c2b13eb27f2f3122bdcc806"
+vue-template-compiler@^2.5.17:
+ version "2.5.17"
+ resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.5.17.tgz#52a4a078c327deb937482a509ae85c06f346c3cb"
+ dependencies:
+ de-indent "^1.0.2"
+ he "^1.1.0"
+
+vue-template-es2015-compiler@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz#dc42697133302ce3017524356a6c61b7b69b4a18"
+
+vue@^2.5.17:
+ version "2.5.17"
+ resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.17.tgz#0f8789ad718be68ca1872629832ed533589c6ada"
+
whet.extend@~0.9.9:
version "0.9.9"
resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"
From 86ff0851a0dd095f02dd841274f99cf8d211de10 Mon Sep 17 00:00:00 2001
From: Faris Ansari
Date: Wed, 29 Aug 2018 12:43:57 +0530
Subject: [PATCH 38/56] style: fix linting issues (#6026)
---
frappe/public/js/frappe/event_emitter.js | 46 ++++++++++-----------
frappe/public/js/frappe/misc/pretty_date.js | 2 +-
rollup/config.js | 2 +-
3 files changed, 25 insertions(+), 25 deletions(-)
diff --git a/frappe/public/js/frappe/event_emitter.js b/frappe/public/js/frappe/event_emitter.js
index 4b6ccb240e..6c721b90aa 100644
--- a/frappe/public/js/frappe/event_emitter.js
+++ b/frappe/public/js/frappe/event_emitter.js
@@ -3,34 +3,34 @@ frappe.provide('frappe.utils');
* Simple EventEmitter which uses jQuery's event system
*/
class EventEmitter {
- init() {
- this.jq = jQuery(this);
- }
+ init() {
+ this.jq = jQuery(this);
+ }
- trigger(evt, data) {
- !this.jq && this.init();
- this.jq.trigger(evt, data);
- }
+ trigger(evt, data) {
+ !this.jq && this.init();
+ this.jq.trigger(evt, data);
+ }
- once(evt, handler) {
- !this.jq && this.init();
- this.jq.one(evt, (e, data) => handler(data));
- }
+ once(evt, handler) {
+ !this.jq && this.init();
+ this.jq.one(evt, (e, data) => handler(data));
+ }
- on(evt, handler) {
- !this.jq && this.init();
- this.jq.bind(evt, (e, data) => handler(data));
- }
+ on(evt, handler) {
+ !this.jq && this.init();
+ this.jq.bind(evt, (e, data) => handler(data));
+ }
- off(evt, handler) {
- !this.jq && this.init();
- this.jq.unbind(evt, (e, data) => handler(data));
- }
+ off(evt, handler) {
+ !this.jq && this.init();
+ this.jq.unbind(evt, (e, data) => handler(data));
+ }
}
frappe.utils.make_event_emitter = function(object) {
- Object.assign(object, EventEmitter.prototype);
- return object;
-}
+ Object.assign(object, EventEmitter.prototype);
+ return object;
+};
-export default EventEmitter;
\ No newline at end of file
+export default EventEmitter;
diff --git a/frappe/public/js/frappe/misc/pretty_date.js b/frappe/public/js/frappe/misc/pretty_date.js
index aef95fc953..1ad02e675c 100644
--- a/frappe/public/js/frappe/misc/pretty_date.js
+++ b/frappe/public/js/frappe/misc/pretty_date.js
@@ -68,7 +68,7 @@ window.comment_when = function(datetime, mini) {
+ '" title="' + timestamp + '">'
+ prettyDate(datetime, mini) + '';
};
-frappe.datetime.comment_when = comment_when
+frappe.datetime.comment_when = comment_when;
frappe.datetime.refresh_when = function() {
if (jQuery) {
diff --git a/rollup/config.js b/rollup/config.js
index a25039f1f5..c794cc3c86 100644
--- a/rollup/config.js
+++ b/rollup/config.js
@@ -52,7 +52,7 @@ function get_rollup_options_for_js(output_file, input_files) {
node_resolve({
customResolveOptions: {
paths: apps_list.map(app => {
- return path.resolve(get_app_path(app), '../node_modules')
+ return path.resolve(get_app_path(app), '../node_modules');
}).filter(fs.existsSync)
}
}),
From 0292a39d21753fb54ed64a49faa596f08fd0dc02 Mon Sep 17 00:00:00 2001
From: Charles-Henri Decultot
Date: Wed, 29 Aug 2018 09:14:58 +0200
Subject: [PATCH 39/56] Make description translatable (#6024)
---
frappe/core/doctype/data_import/data_import.json | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/frappe/core/doctype/data_import/data_import.json b/frappe/core/doctype/data_import/data_import.json
index e314402b39..11c8368e00 100644
--- a/frappe/core/doctype/data_import/data_import.json
+++ b/frappe/core/doctype/data_import/data_import.json
@@ -356,7 +356,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "description": "If this is checked, rows with valid data will be imported and invalid rows will be dumped into a new file for you to import later.\n",
+ "description": "If this is checked, rows with valid data will be imported and invalid rows will be dumped into a new file for you to import later.",
"fieldname": "skip_errors",
"fieldtype": "Check",
"hidden": 0,
@@ -727,7 +727,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 1,
- "modified": "2018-08-23 15:05:56.787108",
+ "modified": "2018-08-28 15:05:56.787108",
"modified_by": "Administrator",
"module": "Core",
"name": "Data Import",
@@ -764,4 +764,4 @@
"track_changes": 1,
"track_seen": 1,
"track_views": 0
-}
\ No newline at end of file
+}
From ca1946152d81519bd6a218eb723ff439b54686fa Mon Sep 17 00:00:00 2001
From: Nabin Hait
Date: Wed, 29 Aug 2018 12:45:01 +0530
Subject: [PATCH 40/56] Update email_alert.py
---
frappe/email/doctype/email_alert/email_alert.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/frappe/email/doctype/email_alert/email_alert.py b/frappe/email/doctype/email_alert/email_alert.py
index ac0ef21536..1da959956f 100755
--- a/frappe/email/doctype/email_alert/email_alert.py
+++ b/frappe/email/doctype/email_alert/email_alert.py
@@ -161,7 +161,6 @@ def get_context(context):
if self.sender:
sender = formataddr((self.sender, self.sender_email))
- frappe.errprint(sender)
if self.is_standard:
self.load_standard_properties(context)
From 8100327b51a92224dd667c38753e486de9771f1f Mon Sep 17 00:00:00 2001
From: Nabin Hait
Date: Wed, 29 Aug 2018 13:16:09 +0600
Subject: [PATCH 41/56] bumped to version 10.1.46
---
frappe/__init__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frappe/__init__.py b/frappe/__init__.py
index 9dd5cc427b..bdc8232ea3 100644
--- a/frappe/__init__.py
+++ b/frappe/__init__.py
@@ -14,7 +14,7 @@ import os, sys, importlib, inspect, json
from .exceptions import *
from .utils.jinja import get_jenv, get_template, render_template, get_email_from_template
-__version__ = '10.1.45'
+__version__ = '10.1.46'
__title__ = "Frappe Framework"
local = Local()
From 394f451b6c84f35b3df4ed26ed9cb2e8f0d6c0a2 Mon Sep 17 00:00:00 2001
From: Rushabh Mehta
Date: Wed, 29 Aug 2018 14:57:34 +0530
Subject: [PATCH 42/56] ux(assignment): allow assignment without any value
---
frappe/desk/form/assign_to.py | 3 +++
frappe/public/js/frappe/form/footer/assign_to.js | 1 -
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/frappe/desk/form/assign_to.py b/frappe/desk/form/assign_to.py
index 7e6500b7e4..f13f853636 100644
--- a/frappe/desk/form/assign_to.py
+++ b/frappe/desk/form/assign_to.py
@@ -47,6 +47,9 @@ def add(args=None):
# if args.get("re_assign"):
# remove_from_todo_if_already_assigned(args['doctype'], args['name'])
+ if not args.get('description'):
+ args['description'] = _('Assignment')
+
d = frappe.get_doc({
"doctype":"ToDo",
"owner": args['assign_to'],
diff --git a/frappe/public/js/frappe/form/footer/assign_to.js b/frappe/public/js/frappe/form/footer/assign_to.js
index 52d134b6ff..36e845cc54 100644
--- a/frappe/public/js/frappe/form/footer/assign_to.js
+++ b/frappe/public/js/frappe/form/footer/assign_to.js
@@ -170,7 +170,6 @@ frappe.ui.form.AssignToDialog = Class.extend({
me.get_field("assign_to").$wrapper.toggle(false);
} else {
me.set_value("assign_to", "");
- me.set_value("notify", 1);
me.get_field("notify").$wrapper.toggle(true);
me.get_field("assign_to").$wrapper.toggle(true);
}
From 6b508cf809135986ff4ded97ebd094103e273eac Mon Sep 17 00:00:00 2001
From: Faris Ansari
Date: Wed, 29 Aug 2018 15:47:19 +0530
Subject: [PATCH 43/56] fix: Number format (#6028)
---
frappe/public/js/frappe/misc/number_format.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/frappe/public/js/frappe/misc/number_format.js b/frappe/public/js/frappe/misc/number_format.js
index ab415a8727..dbd76b134b 100644
--- a/frappe/public/js/frappe/misc/number_format.js
+++ b/frappe/public/js/frappe/misc/number_format.js
@@ -84,7 +84,8 @@ window.format_number = function (v, format, decimals) {
v = flt(v, decimals, format);
- if (v < 0) var is_negative = true;
+ let is_negative = false;
+ if (v < 0) is_negative = true;
v = Math.abs(v);
v = v.toFixed(decimals);
From 41d1446c047ffb91bc9e7ccd53970a63bccdc9eb Mon Sep 17 00:00:00 2001
From: Zarrar
Date: Wed, 29 Aug 2018 16:05:47 +0530
Subject: [PATCH 44/56] functions already added in delivery_triip.py (#6027)
---
.../google_maps_settings/google_maps_settings.py | 15 ---------------
1 file changed, 15 deletions(-)
diff --git a/frappe/integrations/doctype/google_maps_settings/google_maps_settings.py b/frappe/integrations/doctype/google_maps_settings/google_maps_settings.py
index a4f61f500d..8d978c2263 100644
--- a/frappe/integrations/doctype/google_maps_settings/google_maps_settings.py
+++ b/frappe/integrations/doctype/google_maps_settings/google_maps_settings.py
@@ -24,18 +24,3 @@ class GoogleMapsSettings(Document):
frappe.throw(e.message)
return client
-
-def round_timedelta(td, period):
- """Round timedelta"""
- period_seconds = period.total_seconds()
- half_period_seconds = period_seconds / 2
- remainder = td.total_seconds() % period_seconds
- if remainder >= half_period_seconds:
- return datetime.timedelta(seconds=td.total_seconds() + (period_seconds - remainder))
- else:
- return datetime.timedelta(seconds=td.total_seconds() - remainder)
-
-def format_address(address):
- """Customer Address format """
- address = frappe.get_doc('Address', address)
- return '{}, {}, {}, {}'.format(address.address_line1, address.city, address.pincode, address.country)
From adfc4d726f5951d2793cac98d7df9fc80e4b6a9d Mon Sep 17 00:00:00 2001
From: Faris Ansari
Date: Wed, 29 Aug 2018 16:12:32 +0530
Subject: [PATCH 45/56] fix(css): Commonify awesomplete styles (#6029)
---
frappe/public/build.json | 2 -
.../public/js/lib/awesomplete/awesomplete.css | 12 +--
frappe/public/less/awesomplete.less | 80 +++++++++++++++++++
frappe/public/less/controls.less | 54 +------------
frappe/public/less/desk.less | 54 -------------
5 files changed, 87 insertions(+), 115 deletions(-)
create mode 100644 frappe/public/less/awesomplete.less
diff --git a/frappe/public/build.json b/frappe/public/build.json
index 25fae164d5..f72ce0561e 100755
--- a/frappe/public/build.json
+++ b/frappe/public/build.json
@@ -5,7 +5,6 @@
"public/less/website.less",
"public/less/avatar.less",
"node_modules/highlight.js/styles/zenburn.css",
- "public/js/lib/awesomplete/awesomplete.css",
"public/less/form.less",
"public/less/controls.less",
"public/less/chat.less",
@@ -93,7 +92,6 @@
],
"css/desk.min.css": [
"public/js/lib/datepicker/datepicker.min.css",
- "public/js/lib/awesomplete/awesomplete.css",
"public/js/lib/summernote/summernote.css",
"public/js/lib/leaflet/leaflet.css",
"public/js/lib/leaflet/leaflet.draw.css",
diff --git a/frappe/public/js/lib/awesomplete/awesomplete.css b/frappe/public/js/lib/awesomplete/awesomplete.css
index 0b2ea34fe6..26fcd9105c 100755
--- a/frappe/public/js/lib/awesomplete/awesomplete.css
+++ b/frappe/public/js/lib/awesomplete/awesomplete.css
@@ -47,7 +47,7 @@
transition: .3s cubic-bezier(.4,.2,.5,1.4);
transform-origin: 1.43em -.43em;
}
-
+
.awesomplete > ul[hidden],
.awesomplete > ul:empty {
opacity: 0;
@@ -78,25 +78,25 @@
padding: .2em .5em;
cursor: pointer;
}
-
+
.awesomplete > ul > li:hover {
background: hsl(200, 40%, 80%);
color: black;
}
-
+
.awesomplete > ul > li[aria-selected="true"] {
background: hsl(205, 40%, 40%);
color: white;
}
-
+
.awesomplete mark {
background: hsl(65, 100%, 50%);
}
-
+
.awesomplete li:hover mark {
background: hsl(68, 100%, 41%);
}
-
+
.awesomplete li[aria-selected="true"] mark {
background: hsl(86, 100%, 21%);
color: inherit;
diff --git a/frappe/public/less/awesomplete.less b/frappe/public/less/awesomplete.less
new file mode 100644
index 0000000000..1642e3171d
--- /dev/null
+++ b/frappe/public/less/awesomplete.less
@@ -0,0 +1,80 @@
+.awesomplete {
+
+ display: inline-block;
+ position: relative;
+
+ [hidden] {
+ display: none;
+ }
+
+ .visually-hidden {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ }
+
+ &> input {
+ display: block;
+ }
+
+ width: 100%;
+
+ &> ul:empty {
+ display: none;
+ }
+
+ &> ul {
+ position: absolute;
+ left: 0;
+ min-width: 100%;
+ box-sizing: border-box;
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ background: #fff;
+ transition: none;
+ background-color: #fff;
+ max-height: 200px;
+ overflow-y: auto;
+ overflow-x: hidden;
+ border-radius: 0px 0px 4px 4px;
+ box-shadow: 0px 6px 12px rgba(0, 0, 0, 0.176);
+ border: 1px solid @border-color;
+ z-index: 1041 !important;
+ text-shadow: none;
+
+ li[aria-selected="true"] mark, mark {
+ padding: 0px;
+ background-color: inherit;
+ }
+
+ &> li {
+ cursor: pointer;
+ font-size: 12px;
+ padding: 9px 11.8px;
+ }
+
+ &> li .link-option {
+ font-weight: normal;
+ }
+
+ &> li:hover, &> li[aria-selected=true] {
+ background-color: @btn-bg;
+ color: @text-color;
+ text-shadow: none;
+ }
+
+ a:hover {
+ text-decoration: none;
+ }
+
+ p {
+ margin: 3px 0;
+ }
+ }
+
+ @media (max-width: @screen-sm) {
+ &>ul {
+ top: 26px;
+ }
+ }
+}
\ No newline at end of file
diff --git a/frappe/public/less/controls.less b/frappe/public/less/controls.less
index b8260f947f..19a86cdd74 100644
--- a/frappe/public/less/controls.less
+++ b/frappe/public/less/controls.less
@@ -1,6 +1,7 @@
@import "variables.less";
@import "mixins.less";
@import "common.less";
+@import "awesomplete.less";
.unit-checkbox {
color: #36414c;
@@ -42,56 +43,3 @@
z-index: 3;
}
-.awesomplete {
- width: 100%;
-
- &> ul {
- z-index: 1041 !important;
- transition: none;
- background-color: #fff;
- max-height: 200px;
- overflow-y: auto;
- overflow-x: hidden;
- border-radius: 0px 0px 4px 4px;
- box-shadow: 0px 6px 12px rgba(0, 0, 0, 0.176);
- border-color: @border-color;
-
- &:before {
- display: none;
- }
-
- li[aria-selected="true"] mark, mark {
- padding: 0px;
- background-color: inherit;
- }
-
- &> li {
- font-size: 12px;
- padding: 9px 11.8px;
- }
-
- &> li .link-option {
- font-weight: normal;
- }
-
- &> li:hover, &> li[aria-selected=true] {
- background-color: @btn-bg;
- color: @text-color;
- text-shadow: none;
- }
-
- a:hover {
- text-decoration: none;
- }
-
- p {
- margin: 3px 0;
- }
- }
-
- @media (max-width: @screen-sm) {
- &>ul {
- top: 26px;
- }
- }
-}
diff --git a/frappe/public/less/desk.less b/frappe/public/less/desk.less
index b9d35adb44..5de3b2c86c 100644
--- a/frappe/public/less/desk.less
+++ b/frappe/public/less/desk.less
@@ -206,60 +206,6 @@ textarea.form-control {
display: none;
}
-.awesomplete {
- width: 100%;
-
- &> ul {
- z-index: 1041 !important;
- transition: none;
- background-color: #fff;
- max-height: 200px;
- overflow-y: auto;
- overflow-x: hidden;
- border-radius: 0px 0px 4px 4px;
- box-shadow: 0px 6px 12px rgba(0, 0, 0, 0.176);
- border-color: @border-color;
-
- &:before {
- display: none;
- }
-
- li[aria-selected="true"] mark, mark {
- padding: 0px;
- background-color: inherit;
- }
-
- &> li {
- font-size: 12px;
- padding: 9px 11.8px;
- }
-
- &> li .link-option {
- font-weight: normal;
- }
-
- &> li:hover, &> li[aria-selected=true] {
- background-color: @btn-bg;
- color: @text-color;
- text-shadow: none;
- }
-
- a:hover {
- text-decoration: none;
- }
-
- p {
- margin: 3px 0;
- }
- }
-
- @media (max-width: @screen-sm) {
- &>ul {
- top: 26px;
- }
- }
-}
-
.barcode-wrapper {
text-align: center;
}
From a9f32f292c5a5c2b4283e247790f03d993a3b0e4 Mon Sep 17 00:00:00 2001
From: Rushabh Mehta
Date: Wed, 29 Aug 2018 17:09:35 +0530
Subject: [PATCH 46/56] default(perms): add default import, export perms
---
frappe/contacts/doctype/address/address.json | 1361 ++++++-------
frappe/contacts/doctype/contact/contact.json | 1677 +++++++++--------
.../core/doctype/data_import/data_import.js | 2 +-
frappe/core/doctype/doctype/doctype.py | 12 +-
frappe/geo/doctype/country/country.json | 367 ++--
frappe/geo/doctype/currency/currency.json | 613 +++---
6 files changed, 2059 insertions(+), 1973 deletions(-)
diff --git a/frappe/contacts/doctype/address/address.json b/frappe/contacts/doctype/address/address.json
index 975aae0682..1f7e09d66e 100644
--- a/frappe/contacts/doctype/address/address.json
+++ b/frappe/contacts/doctype/address/address.json
@@ -1,724 +1,743 @@
{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 1,
- "allow_rename": 1,
- "beta": 0,
- "creation": "2013-01-10 16:34:32",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "Setup",
- "editable_grid": 0,
+ "allow_copy": 0,
+ "allow_guest_to_view": 0,
+ "allow_import": 1,
+ "allow_rename": 1,
+ "beta": 0,
+ "creation": "2013-01-10 16:34:32",
+ "custom": 0,
+ "docstatus": 0,
+ "doctype": "DocType",
+ "document_type": "Setup",
+ "editable_grid": 0,
"fields": [
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "address_details",
- "fieldtype": "Section Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "",
- "length": 0,
- "no_copy": 0,
- "options": "fa fa-map-marker",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "address_details",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "",
+ "length": 0,
+ "no_copy": 0,
+ "options": "fa fa-map-marker",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "description": "",
- "fieldname": "address_title",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Address Title",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "description": "",
+ "fieldname": "address_title",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Address Title",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "address_type",
- "fieldtype": "Select",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Address Type",
- "length": 0,
- "no_copy": 0,
- "options": "Billing\nShipping\nOffice\nPersonal\nPlant\nPostal\nShop\nSubsidiary\nWarehouse\nCurrent\nPermanent\nOther",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "address_type",
+ "fieldtype": "Select",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 1,
+ "in_standard_filter": 1,
+ "label": "Address Type",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Billing\nShipping\nOffice\nPersonal\nPlant\nPostal\nShop\nSubsidiary\nWarehouse\nCurrent\nPermanent\nOther",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "address_line1",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Address Line 1",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "address_line1",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Address Line 1",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "address_line2",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Address Line 2",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "address_line2",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Address Line 2",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "city",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 1,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "City/Town",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 1,
- "set_only_once": 0,
- "translatable": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "city",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 1,
+ "in_list_view": 1,
+ "in_standard_filter": 0,
+ "label": "City/Town",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 1,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "county",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "County",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "county",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "County",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "state",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "State",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "state",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "State",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "country",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 1,
- "in_list_view": 0,
- "in_standard_filter": 1,
- "label": "Country",
- "length": 0,
- "no_copy": 0,
- "options": "Country",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 1,
- "set_only_once": 0,
- "translatable": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "country",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 1,
+ "in_list_view": 0,
+ "in_standard_filter": 1,
+ "label": "Country",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Country",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 1,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "pincode",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Postal Code",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 1,
- "set_only_once": 0,
- "translatable": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "pincode",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Postal Code",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 1,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break0",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "column_break0",
+ "fieldtype": "Column Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0,
"width": "50%"
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "email_id",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Email Address",
- "length": 0,
- "no_copy": 0,
- "options": "Email",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "email_id",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Email Address",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Email",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "phone",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Phone",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "phone",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Phone",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "fax",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Fax",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "fax",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Fax",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "default": "0",
- "description": "",
- "fieldname": "is_primary_address",
- "fieldtype": "Check",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Preferred Billing Address",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "default": "0",
+ "description": "",
+ "fieldname": "is_primary_address",
+ "fieldtype": "Check",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Preferred Billing Address",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "default": "0",
- "description": "",
- "fieldname": "is_shipping_address",
- "fieldtype": "Check",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Preferred Shipping Address",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "default": "0",
+ "description": "",
+ "fieldname": "is_shipping_address",
+ "fieldtype": "Check",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Preferred Shipping Address",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "linked_with",
- "fieldtype": "Section Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Reference",
- "length": 0,
- "no_copy": 0,
- "options": "fa fa-pushpin",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "linked_with",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Reference",
+ "length": 0,
+ "no_copy": 0,
+ "options": "fa fa-pushpin",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "default": "0",
- "fieldname": "is_your_company_address",
- "fieldtype": "Check",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Is Your Company Address",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "default": "0",
+ "fieldname": "is_your_company_address",
+ "fieldtype": "Check",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Is Your Company Address",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "links",
- "fieldtype": "Table",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Links",
- "length": 0,
- "no_copy": 0,
- "options": "Dynamic Link",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "links",
+ "fieldtype": "Table",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Links",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Dynamic Link",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
}
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "icon": "fa fa-map-marker",
- "idx": 5,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2018-06-29 23:48:41.515118",
- "modified_by": "Administrator",
- "module": "Contacts",
- "name": "Address",
- "name_case": "Title Case",
- "owner": "Administrator",
+ ],
+ "has_web_view": 0,
+ "hide_heading": 0,
+ "hide_toolbar": 0,
+ "icon": "fa fa-map-marker",
+ "idx": 5,
+ "image_view": 0,
+ "in_create": 0,
+ "is_submittable": 0,
+ "issingle": 0,
+ "istable": 0,
+ "max_attachments": 0,
+ "modified": "2018-08-29 06:24:53.192890",
+ "modified_by": "Administrator",
+ "module": "Contacts",
+ "name": "Address",
+ "name_case": "Title Case",
+ "owner": "Administrator",
"permissions": [
{
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Sales User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 0,
+ "email": 1,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Sales User",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
"write": 1
- },
+ },
{
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Purchase User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 0,
+ "email": 1,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Purchase User",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
"write": 1
- },
+ },
{
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Maintenance User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 0,
+ "email": 1,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Maintenance User",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
"write": 1
- },
+ },
{
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Accounts User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 0,
+ "email": 1,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Accounts User",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
+ "write": 1
+ },
+ {
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "if_owner": 0,
+ "import": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "System Manager",
+ "set_user_permissions": 1,
+ "share": 1,
+ "submit": 0,
"write": 1
}
- ],
- "quick_entry": 0,
- "read_only": 0,
- "read_only_onload": 0,
- "search_fields": "country, state",
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0,
+ ],
+ "quick_entry": 0,
+ "read_only": 0,
+ "read_only_onload": 0,
+ "search_fields": "country, state",
+ "show_name_in_global_search": 0,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 0,
+ "track_seen": 0,
"track_views": 0
}
\ No newline at end of file
diff --git a/frappe/contacts/doctype/contact/contact.json b/frappe/contacts/doctype/contact/contact.json
index d40866b290..488cd1a67a 100644
--- a/frappe/contacts/doctype/contact/contact.json
+++ b/frappe/contacts/doctype/contact/contact.json
@@ -1,894 +1,923 @@
{
- "allow_copy": 0,
- "allow_guest_to_view": 0,
- "allow_import": 1,
- "allow_rename": 1,
- "beta": 0,
- "creation": "2013-01-10 16:34:32",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "Setup",
- "editable_grid": 0,
- "engine": "InnoDB",
+ "allow_copy": 0,
+ "allow_guest_to_view": 0,
+ "allow_import": 1,
+ "allow_rename": 1,
+ "beta": 0,
+ "creation": "2013-01-10 16:34:32",
+ "custom": 0,
+ "docstatus": 0,
+ "doctype": "DocType",
+ "document_type": "Setup",
+ "editable_grid": 0,
+ "engine": "InnoDB",
"fields": [
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "contact_section",
- "fieldtype": "Section Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "",
- "length": 0,
- "no_copy": 0,
- "options": "fa fa-user",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "contact_section",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "",
+ "length": 0,
+ "no_copy": 0,
+ "options": "fa fa-user",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "first_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 1,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "First Name",
- "length": 0,
- "no_copy": 0,
- "oldfieldname": "first_name",
- "oldfieldtype": "Data",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "first_name",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 1,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "First Name",
+ "length": 0,
+ "no_copy": 0,
+ "oldfieldname": "first_name",
+ "oldfieldtype": "Data",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 1,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "last_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Last Name",
- "length": 0,
- "no_copy": 0,
- "oldfieldname": "last_name",
- "oldfieldtype": "Data",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 1,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "last_name",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Last Name",
+ "length": 0,
+ "no_copy": 0,
+ "oldfieldname": "last_name",
+ "oldfieldtype": "Data",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 1,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "email_id",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 1,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Email Address",
- "length": 0,
- "no_copy": 0,
- "oldfieldname": "email_id",
- "oldfieldtype": "Data",
- "options": "Email",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 1,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 1,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "email_id",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 1,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Email Address",
+ "length": 0,
+ "no_copy": 0,
+ "oldfieldname": "email_id",
+ "oldfieldtype": "Data",
+ "options": "Email",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 1,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "user",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 1,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "User Id",
- "length": 0,
- "no_copy": 0,
- "options": "User",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "user",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 1,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "User Id",
+ "length": 0,
+ "no_copy": 0,
+ "options": "User",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "cb00",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "cb00",
+ "fieldtype": "Column Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "default": "Passive",
- "fieldname": "status",
- "fieldtype": "Select",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 1,
- "label": "Status",
- "length": 0,
- "no_copy": 0,
- "options": "Passive\nOpen\nReplied",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "default": "Passive",
+ "fieldname": "status",
+ "fieldtype": "Select",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 1,
+ "in_standard_filter": 1,
+ "label": "Status",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Passive\nOpen\nReplied",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "salutation",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Salutation",
- "length": 0,
- "no_copy": 0,
- "options": "Salutation",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "salutation",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Salutation",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Salutation",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "gender",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Gender",
- "length": 0,
- "no_copy": 0,
- "options": "Gender",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "gender",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Gender",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Gender",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 1,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "phone",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Phone",
- "length": 0,
- "no_copy": 0,
- "oldfieldname": "contact_no",
- "oldfieldtype": "Data",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 1,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "phone",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Phone",
+ "length": 0,
+ "no_copy": 0,
+ "oldfieldname": "contact_no",
+ "oldfieldtype": "Data",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 1,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "mobile_no",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 1,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Mobile No",
- "length": 0,
- "no_copy": 0,
- "oldfieldname": "mobile_no",
- "oldfieldtype": "Data",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 1,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "mobile_no",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 1,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Mobile No",
+ "length": 0,
+ "no_copy": 0,
+ "oldfieldname": "mobile_no",
+ "oldfieldtype": "Data",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "image",
- "fieldtype": "Attach Image",
- "hidden": 1,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Image",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 1,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "image",
+ "fieldtype": "Attach Image",
+ "hidden": 1,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Image",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "contact_details",
- "fieldtype": "Section Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Reference",
- "length": 0,
- "no_copy": 0,
- "options": "fa fa-pushpin",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "contact_details",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Reference",
+ "length": 0,
+ "no_copy": 0,
+ "options": "fa fa-pushpin",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "default": "0",
- "depends_on": "",
- "fieldname": "is_primary_contact",
- "fieldtype": "Check",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Is Primary Contact",
- "length": 0,
- "no_copy": 0,
- "oldfieldname": "is_primary_contact",
- "oldfieldtype": "Select",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "default": "0",
+ "depends_on": "",
+ "fieldname": "is_primary_contact",
+ "fieldtype": "Check",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Is Primary Contact",
+ "length": 0,
+ "no_copy": 0,
+ "oldfieldname": "is_primary_contact",
+ "oldfieldtype": "Select",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "links",
- "fieldtype": "Table",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Links",
- "length": 0,
- "no_copy": 0,
- "options": "Dynamic Link",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "links",
+ "fieldtype": "Table",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Links",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Dynamic Link",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "more_info",
- "fieldtype": "Section Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "More Information",
- "length": 0,
- "no_copy": 0,
- "options": "fa fa-file-text",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "more_info",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "More Information",
+ "length": 0,
+ "no_copy": 0,
+ "options": "fa fa-file-text",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "description": "",
- "fieldname": "department",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Department",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "description": "",
+ "fieldname": "department",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Department",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "description": "",
- "fieldname": "designation",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Designation",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "description": "",
+ "fieldname": "designation",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Designation",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "column_break_17",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "column_break_17",
+ "fieldtype": "Column Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "unsubscribed",
- "fieldtype": "Check",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Unsubscribed",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "unsubscribed",
+ "fieldtype": "Check",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Unsubscribed",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
}
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "icon": "fa fa-user",
- "idx": 1,
- "image_field": "image",
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2017-06-21 17:17:44.694188",
- "modified_by": "Administrator",
- "module": "Contacts",
- "name": "Contact",
- "name_case": "Title Case",
- "owner": "Administrator",
+ ],
+ "has_web_view": 0,
+ "hide_heading": 0,
+ "hide_toolbar": 0,
+ "icon": "fa fa-user",
+ "idx": 1,
+ "image_field": "image",
+ "image_view": 0,
+ "in_create": 0,
+ "is_submittable": 0,
+ "issingle": 0,
+ "istable": 0,
+ "max_attachments": 0,
+ "modified": "2018-08-29 06:24:58.902664",
+ "modified_by": "Administrator",
+ "module": "Contacts",
+ "name": "Contact",
+ "name_case": "Title Case",
+ "owner": "Administrator",
"permissions": [
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "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": 1,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "if_owner": 0,
+ "import": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "System Manager",
+ "set_user_permissions": 1,
+ "share": 1,
+ "submit": 0,
"write": 1
- },
+ },
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Sales Master Manager",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Sales Master Manager",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
"write": 1
- },
+ },
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Purchase Master Manager",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Purchase Master Manager",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
"write": 1
- },
+ },
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Sales Manager",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 0,
+ "email": 1,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Sales Manager",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
"write": 1
- },
+ },
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Purchase Manager",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 0,
+ "email": 1,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Purchase Manager",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
"write": 1
- },
+ },
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Maintenance Manager",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 0,
+ "email": 1,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Maintenance Manager",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
"write": 1
- },
+ },
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Accounts Manager",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 0,
+ "email": 1,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Accounts Manager",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
"write": 1
- },
+ },
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Sales User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 0,
+ "email": 1,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Sales User",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
"write": 1
- },
+ },
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Purchase User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 0,
+ "email": 1,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Purchase User",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
"write": 1
- },
+ },
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Maintenance User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 0,
+ "email": 1,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Maintenance User",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
"write": 1
- },
+ },
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Accounts User",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 0,
+ "email": 1,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Accounts User",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
"write": 1
- },
+ },
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 0,
- "delete": 0,
- "email": 0,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "match": "",
- "permlevel": 1,
- "print": 0,
- "read": 1,
- "report": 1,
- "role": "All",
- "set_user_permissions": 0,
- "share": 0,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 0,
+ "delete": 0,
+ "email": 0,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "match": "",
+ "permlevel": 1,
+ "print": 0,
+ "read": 1,
+ "report": 1,
+ "role": "All",
+ "set_user_permissions": 0,
+ "share": 0,
+ "submit": 0,
"write": 0
}
- ],
- "quick_entry": 0,
- "read_only": 0,
- "read_only_onload": 0,
- "show_name_in_global_search": 0,
- "sort_order": "ASC",
- "track_changes": 0,
- "track_seen": 0
+ ],
+ "quick_entry": 0,
+ "read_only": 0,
+ "read_only_onload": 0,
+ "show_name_in_global_search": 0,
+ "sort_order": "ASC",
+ "track_changes": 0,
+ "track_seen": 0,
+ "track_views": 0
}
\ No newline at end of file
diff --git a/frappe/core/doctype/data_import/data_import.js b/frappe/core/doctype/data_import/data_import.js
index 3366a40190..a800e677cf 100644
--- a/frappe/core/doctype/data_import/data_import.js
+++ b/frappe/core/doctype/data_import/data_import.js
@@ -37,7 +37,7 @@ frappe.ui.form.on('Data Import', {
frm.disable_save();
frm.dashboard.clear_headline();
if (frm.doc.reference_doctype && !frm.doc.import_file) {
- frm.page.set_indicator(__('Please attach a file to import'), 'orange');
+ frm.page.set_indicator(__('Attach file'), 'orange');
} else {
if (frm.doc.import_status) {
const listview_settings = frappe.listview_settings['Data Import'];
diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py
index c5bd1fe78d..f0001ca3e1 100644
--- a/frappe/core/doctype/doctype/doctype.py
+++ b/frappe/core/doctype/doctype/doctype.py
@@ -199,12 +199,12 @@ class DocType(Document):
"""Strip options for whitespaces"""
for field in self.fields:
if field.fieldtype == "Select" and field.options is not None:
- new_options = ""
- for option in field.options.split("\n"):
- new_options += option.strip()
- new_options += "\n"
- new_options.rstrip("\n")
- field.options = new_options
+ options_list = []
+ for i, option in enumerate(field.options.split("\n")):
+ _option = option.strip()
+ if i==0 or _option:
+ options_list.append(_option)
+ field.options = '\n'.join(options_list)
def validate_series(self, autoname=None, name=None):
"""Validate if `autoname` property is correctly set."""
diff --git a/frappe/geo/doctype/country/country.json b/frappe/geo/doctype/country/country.json
index 7c813e4b91..37bcbfdaf5 100644
--- a/frappe/geo/doctype/country/country.json
+++ b/frappe/geo/doctype/country/country.json
@@ -1,193 +1,208 @@
{
- "allow_copy": 0,
- "allow_import": 1,
- "allow_rename": 1,
- "autoname": "field:country_name",
- "beta": 0,
- "creation": "2013-01-19 10:23:30",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "Setup",
- "editable_grid": 0,
+ "allow_copy": 0,
+ "allow_guest_to_view": 0,
+ "allow_import": 1,
+ "allow_rename": 1,
+ "autoname": "field:country_name",
+ "beta": 0,
+ "creation": "2013-01-19 10:23:30",
+ "custom": 0,
+ "docstatus": 0,
+ "doctype": "DocType",
+ "document_type": "Setup",
+ "editable_grid": 0,
"fields": [
{
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "country_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Country Name",
- "length": 0,
- "no_copy": 0,
- "oldfieldname": "country_name",
- "oldfieldtype": "Data",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "country_name",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 1,
+ "in_standard_filter": 0,
+ "label": "Country Name",
+ "length": 0,
+ "no_copy": 0,
+ "oldfieldname": "country_name",
+ "oldfieldtype": "Data",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 1
+ },
{
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "date_format",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Date Format",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "date_format",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 1,
+ "in_standard_filter": 0,
+ "label": "Date Format",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "time_zones",
- "fieldtype": "Text",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Time Zones",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "time_zones",
+ "fieldtype": "Text",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 1,
+ "in_standard_filter": 0,
+ "label": "Time Zones",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "code",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Code",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "code",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 1,
+ "in_standard_filter": 0,
+ "label": "Code",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
}
- ],
- "hide_heading": 0,
- "hide_toolbar": 0,
- "icon": "fa fa-globe",
- "idx": 1,
- "image_view": 0,
- "in_create": 0,
-
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "menu_index": 0,
- "modified": "2016-12-29 14:40:34.951894",
- "modified_by": "Administrator",
- "module": "Geo",
- "name": "Country",
- "owner": "Administrator",
+ ],
+ "has_web_view": 0,
+ "hide_heading": 0,
+ "hide_toolbar": 0,
+ "icon": "fa fa-globe",
+ "idx": 1,
+ "image_view": 0,
+ "in_create": 0,
+ "is_submittable": 0,
+ "issingle": 0,
+ "istable": 0,
+ "max_attachments": 0,
+ "menu_index": 0,
+ "modified": "2018-08-29 06:37:32.303570",
+ "modified_by": "Administrator",
+ "module": "Geo",
+ "name": "Country",
+ "owner": "Administrator",
"permissions": [
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 0,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "is_custom": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "System Manager",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 0,
+ "email": 1,
+ "export": 1,
+ "if_owner": 0,
+ "import": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "System Manager",
+ "set_user_permissions": 1,
+ "share": 1,
+ "submit": 0,
"write": 1
- },
+ },
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 0,
- "delete": 0,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "is_custom": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "All",
- "set_user_permissions": 0,
- "share": 0,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 0,
+ "delete": 0,
+ "email": 1,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "All",
+ "set_user_permissions": 0,
+ "share": 0,
+ "submit": 0,
"write": 0
}
- ],
- "quick_entry": 1,
- "read_only": 0,
- "read_only_onload": 0,
- "sort_field": "country_name",
- "sort_order": "ASC",
- "track_changes": 1,
- "track_seen": 0
+ ],
+ "quick_entry": 1,
+ "read_only": 0,
+ "read_only_onload": 0,
+ "show_name_in_global_search": 0,
+ "sort_field": "country_name",
+ "sort_order": "ASC",
+ "track_changes": 1,
+ "track_seen": 0,
+ "track_views": 0
}
\ No newline at end of file
diff --git a/frappe/geo/doctype/currency/currency.json b/frappe/geo/doctype/currency/currency.json
index 0fce99cfa3..bb9abb7ce8 100644
--- a/frappe/geo/doctype/currency/currency.json
+++ b/frappe/geo/doctype/currency/currency.json
@@ -1,322 +1,345 @@
{
- "allow_copy": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "autoname": "field:currency_name",
- "beta": 0,
- "creation": "2013-01-28 10:06:02",
- "custom": 0,
- "description": "**Currency** Master",
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "Setup",
- "editable_grid": 0,
+ "allow_copy": 0,
+ "allow_guest_to_view": 0,
+ "allow_import": 1,
+ "allow_rename": 1,
+ "autoname": "field:currency_name",
+ "beta": 0,
+ "creation": "2013-01-28 10:06:02",
+ "custom": 0,
+ "description": "**Currency** Master",
+ "docstatus": 0,
+ "doctype": "DocType",
+ "document_type": "Setup",
+ "editable_grid": 0,
"fields": [
{
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "currency_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Currency Name",
- "length": 0,
- "no_copy": 0,
- "oldfieldname": "currency_name",
- "oldfieldtype": "Data",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "currency_name",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Currency Name",
+ "length": 0,
+ "no_copy": 0,
+ "oldfieldname": "currency_name",
+ "oldfieldtype": "Data",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 1
+ },
{
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "enabled",
- "fieldtype": "Check",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Enabled",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "enabled",
+ "fieldtype": "Check",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 1,
+ "in_standard_filter": 0,
+ "label": "Enabled",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "description": "Sub-currency. For e.g. \"Cent\"",
- "fieldname": "fraction",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Fraction",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "description": "Sub-currency. For e.g. \"Cent\"",
+ "fieldname": "fraction",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 1,
+ "in_standard_filter": 0,
+ "label": "Fraction",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "description": "1 Currency = [?] Fraction\nFor e.g. 1 USD = 100 Cent",
- "fieldname": "fraction_units",
- "fieldtype": "Int",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Fraction Units",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "description": "1 Currency = [?] Fraction\nFor e.g. 1 USD = 100 Cent",
+ "fieldname": "fraction_units",
+ "fieldtype": "Int",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 1,
+ "in_standard_filter": 0,
+ "label": "Fraction Units",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "description": "Smallest circulating fraction unit (coin). For e.g. 1 cent for USD and it should be entered as 0.01",
- "fieldname": "smallest_currency_fraction_value",
- "fieldtype": "Currency",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Smallest Currency Fraction Value",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "description": "Smallest circulating fraction unit (coin). For e.g. 1 cent for USD and it should be entered as 0.01",
+ "fieldname": "smallest_currency_fraction_value",
+ "fieldtype": "Currency",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Smallest Currency Fraction Value",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "description": "A symbol for this currency. For e.g. $",
- "fieldname": "symbol",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Symbol",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "description": "A symbol for this currency. For e.g. $",
+ "fieldname": "symbol",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 1,
+ "in_standard_filter": 0,
+ "label": "Symbol",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
- },
+ },
{
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "description": "How should this currency be formatted? If not set, will use system defaults",
- "fieldname": "number_format",
- "fieldtype": "Select",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Number Format",
- "length": 0,
- "no_copy": 0,
- "options": "\n#,###.##\n#.###,##\n# ###.##\n# ###,##\n#'###.##\n#, ###.##\n#,##,###.##\n#,###.###\n#.###\n#,###",
- "permlevel": 0,
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "description": "How should this currency be formatted? If not set, will use system defaults",
+ "fieldname": "number_format",
+ "fieldtype": "Select",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 1,
+ "in_standard_filter": 0,
+ "label": "Number Format",
+ "length": 0,
+ "no_copy": 0,
+ "options": "\n#,###.##\n#.###,##\n# ###.##\n# ###,##\n#'###.##\n#, ###.##\n#,##,###.##\n#,###.###\n#.###\n#,###",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
"unique": 0
}
- ],
- "hide_heading": 0,
- "hide_toolbar": 0,
- "icon": "fa fa-bitcoin",
- "idx": 1,
- "image_view": 0,
- "in_create": 0,
-
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2016-12-29 14:40:39.187557",
- "modified_by": "Administrator",
- "module": "Geo",
- "name": "Currency",
- "owner": "Administrator",
+ ],
+ "has_web_view": 0,
+ "hide_heading": 0,
+ "hide_toolbar": 0,
+ "icon": "fa fa-bitcoin",
+ "idx": 1,
+ "image_view": 0,
+ "in_create": 0,
+ "is_submittable": 0,
+ "issingle": 0,
+ "istable": 0,
+ "max_attachments": 0,
+ "modified": "2018-08-29 06:37:19.908254",
+ "modified_by": "Administrator",
+ "module": "Geo",
+ "name": "Currency",
+ "owner": "Administrator",
"permissions": [
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "is_custom": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "System Manager",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "if_owner": 0,
+ "import": 1,
+ "permlevel": 0,
+ "print": 1,
+ "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": 0,
- "delete": 0,
- "email": 0,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "is_custom": 0,
- "permlevel": 0,
- "print": 0,
- "read": 1,
- "report": 0,
- "role": "Accounts User",
- "set_user_permissions": 0,
- "share": 0,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 0,
+ "delete": 0,
+ "email": 0,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 0,
+ "read": 1,
+ "report": 0,
+ "role": "Accounts User",
+ "set_user_permissions": 0,
+ "share": 0,
+ "submit": 0,
"write": 0
- },
+ },
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 0,
- "delete": 0,
- "email": 0,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "is_custom": 0,
- "permlevel": 0,
- "print": 0,
- "read": 1,
- "report": 0,
- "role": "Sales User",
- "set_user_permissions": 0,
- "share": 0,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 0,
+ "delete": 0,
+ "email": 0,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 0,
+ "read": 1,
+ "report": 0,
+ "role": "Sales User",
+ "set_user_permissions": 0,
+ "share": 0,
+ "submit": 0,
"write": 0
- },
+ },
{
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 0,
- "delete": 0,
- "email": 0,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "is_custom": 0,
- "permlevel": 0,
- "print": 0,
- "read": 1,
- "report": 0,
- "role": "Purchase User",
- "set_user_permissions": 0,
- "share": 0,
- "submit": 0,
+ "amend": 0,
+ "cancel": 0,
+ "create": 0,
+ "delete": 0,
+ "email": 0,
+ "export": 0,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 0,
+ "read": 1,
+ "report": 0,
+ "role": "Purchase User",
+ "set_user_permissions": 0,
+ "share": 0,
+ "submit": 0,
"write": 0
}
- ],
- "quick_entry": 0,
- "read_only": 0,
- "read_only_onload": 0,
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0
+ ],
+ "quick_entry": 0,
+ "read_only": 0,
+ "read_only_onload": 0,
+ "show_name_in_global_search": 0,
+ "sort_order": "DESC",
+ "track_changes": 1,
+ "track_seen": 0,
+ "track_views": 0
}
\ No newline at end of file
From a19f7beb3945d713d6651beb977d59be114f11df Mon Sep 17 00:00:00 2001
From: Rushabh Mehta
Date: Wed, 29 Aug 2018 17:30:27 +0530
Subject: [PATCH 47/56] ux: mandatory red in data import, export
---
.../core/doctype/data_export/data_export.js | 3 +-
.../core/doctype/data_import/data_import.js | 32 +++++++++----------
.../js/frappe/form/controls/multicheck.js | 6 +++-
3 files changed, 22 insertions(+), 19 deletions(-)
diff --git a/frappe/core/doctype/data_export/data_export.js b/frappe/core/doctype/data_export/data_export.js
index 2e740ae4b8..f195e79119 100644
--- a/frappe/core/doctype/data_export/data_export.js
+++ b/frappe/core/doctype/data_export/data_export.js
@@ -144,8 +144,9 @@ const add_doctype_field_multicheck_control = (doctype, parent_wrapper) => {
const options = fields
.map(df => {
return {
- label: df.label + (df.reqd ? ' (M)' : ''),
+ label: df.label,
value: df.fieldname,
+ danger: df.reqd,
checked: 1
};
});
diff --git a/frappe/core/doctype/data_import/data_import.js b/frappe/core/doctype/data_import/data_import.js
index a800e677cf..de4ab8a514 100644
--- a/frappe/core/doctype/data_import/data_import.js
+++ b/frappe/core/doctype/data_import/data_import.js
@@ -147,24 +147,22 @@ frappe.data_import.download_dialog = function(frm) {
const filter_fields = df => frappe.model.is_value_type(df) && !df.hidden;
const get_fields = dt => frappe.meta.get_docfields(dt).filter(filter_fields);
- const get_doctypes = parentdt => {
- return [parentdt].concat(
- frappe.meta.get_table_fields(parentdt).map(df => df.options)
- );
- };
-
const get_doctype_checkbox_fields = () => {
return dialog.fields.filter(df => df.fieldname.endsWith('_fields'))
.map(df => dialog.fields_dict[df.fieldname]);
};
const doctype_fields = get_fields(frm.doc.reference_doctype)
- .map(df => ({
- label: df.label + ((df.reqd || df.fieldname == 'naming_series') ? ' (M)' : ''),
- reqd: (df.reqd || df.fieldname == 'naming_series') ? 1 : 0,
- value: df.fieldname,
- checked: 1
- }));
+ .map(df => {
+ let reqd = (df.reqd || df.fieldname == 'naming_series') ? 1 : 0;
+ return {
+ label: df.label,
+ reqd: reqd,
+ danger: reqd,
+ value: df.fieldname,
+ checked: 1
+ };
+ });
let fields = [
{
@@ -176,15 +174,14 @@ frappe.data_import.download_dialog = function(frm) {
"onchange": function() {
const fields = get_doctype_checkbox_fields();
fields.map(f => f.toggle(true));
- if(this.value == 'Mandatory') {
+ if(this.value == 'Mandatory' || this.value == 'Manually') {
checkbox_toggle(true);
fields.map(multicheck_field => {
multicheck_field.options.map(option => {
if(!option.reqd) return;
$(multicheck_field.$wrapper).find(`:checkbox[data-unit="${option.value}"]`)
.prop('checked', false)
- .trigger('click')
- .prop('disabled', true);
+ .trigger('click');
});
});
} else if(this.value == 'All'){
@@ -237,10 +234,11 @@ frappe.data_import.download_dialog = function(frm) {
"options": frappe.meta.get_docfields(df.options)
.filter(filter_fields)
.map(df => ({
- label: df.label + (df.reqd ? ' (M)' : ''),
+ label: df.label,
reqd: df.reqd ? 1 : 0,
value: df.fieldname,
- checked: 1
+ checked: 1,
+ danger: df.reqd
})),
"columns": 2,
"hidden": 1
diff --git a/frappe/public/js/frappe/form/controls/multicheck.js b/frappe/public/js/frappe/form/controls/multicheck.js
index e09ca8f94f..35e1a1a19b 100644
--- a/frappe/public/js/frappe/form/controls/multicheck.js
+++ b/frappe/public/js/frappe/form/controls/multicheck.js
@@ -26,6 +26,7 @@ frappe.ui.form.ControlMultiCheck = frappe.ui.form.Control.extend({
this.select_options(this.selected_options);
},
+
set_options() {
this.$load_state.show();
this.$select_buttons.hide();
@@ -65,7 +66,10 @@ frappe.ui.form.ControlMultiCheck = frappe.ui.form.Control.extend({
this.$load_state.hide();
this.$checkbox_area.empty();
this.options.forEach(option => {
- this.get_checkbox_element(option).appendTo(this.$checkbox_area);
+ let checkbox = this.get_checkbox_element(option).appendTo(this.$checkbox_area);
+ if (option.danger) {
+ checkbox.find('.label-area').addClass('text-danger');
+ }
});
if(this.df.select_all) {
this.setup_select_all();
From 5944ba312a4aac823ea903af0e0a706a23321d9c Mon Sep 17 00:00:00 2001
From: Rushabh Mehta
Date: Thu, 30 Aug 2018 09:22:26 +0530
Subject: [PATCH 48/56] ux(quick-entry): allow any length
---
frappe/public/js/frappe/form/grid.js | 4 ++--
frappe/public/js/frappe/form/quick_entry.js | 10 +++++-----
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/frappe/public/js/frappe/form/grid.js b/frappe/public/js/frappe/form/grid.js
index 073b140887..738d3fd050 100644
--- a/frappe/public/js/frappe/form/grid.js
+++ b/frappe/public/js/frappe/form/grid.js
@@ -366,11 +366,11 @@ export default class Grid {
return data;
}
get_modal_data() {
- return this.df.get_data().filter(data => {
+ return this.df.get_data ? this.df.get_data().filter(data => {
if (!this.deleted_docs || !in_list(this.deleted_docs, data.name)) {
return data;
}
- });
+ }) : [];
}
set_column_disp(fieldname, show) {
if($.isArray(fieldname)) {
diff --git a/frappe/public/js/frappe/form/quick_entry.js b/frappe/public/js/frappe/form/quick_entry.js
index 6539140cfc..e733b3dda6 100644
--- a/frappe/public/js/frappe/form/quick_entry.js
+++ b/frappe/public/js/frappe/form/quick_entry.js
@@ -60,10 +60,10 @@ frappe.ui.form.QuickEntryForm = Class.extend({
this.validate_for_prompt_autoname();
- if (this.too_many_mandatory_fields() || this.has_child_table()
- || !this.mandatory.length) {
- return false;
- }
+ // if (this.too_many_mandatory_fields() || this.has_child_table()
+ // || !this.mandatory.length) {
+ // return false;
+ // }
return true;
},
@@ -212,7 +212,7 @@ frappe.ui.form.QuickEntryForm = Class.extend({
render_edit_in_full_page_link: function(){
var me = this;
- var $link = $('' +
+ var $link = $('
' +
'
').appendTo(this.dialog.body);
$link.find('.edit-full').on('click', function() {
From 22934b4e8ccfcca0a29fe7d41d0fc17906a2dc55 Mon Sep 17 00:00:00 2001
From: Rushabh Mehta
Date: Thu, 30 Aug 2018 10:27:52 +0530
Subject: [PATCH 49/56] fix(translate): #5906 via CodeTriage
---
frappe/translate.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frappe/translate.py b/frappe/translate.py
index 800aa85f01..e92ab271eb 100644
--- a/frappe/translate.py
+++ b/frappe/translate.py
@@ -507,7 +507,7 @@ def extract_messages_from_code(code, is_py=False):
:param code: code from which translatable files are to be extracted
:param is_py: include messages in triple quotes e.g. `_('''message''')`"""
try:
- code = render_include(code)
+ code = frappe.as_unicode(render_include(code))
except (TemplateError, ImportError, InvalidIncludePath):
# Exception will occur when it encounters John Resig's microtemplating code
pass
From 9bd558758352908d138756071af6a613dadb2023 Mon Sep 17 00:00:00 2001
From: Rushabh Mehta
Date: Thu, 30 Aug 2018 10:35:19 +0530
Subject: [PATCH 50/56] readme: codetriage badge
---
README.md | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/README.md b/README.md
index 66143d801b..b67e333f5e 100644
--- a/README.md
+++ b/README.md
@@ -20,8 +20,13 @@
+
+
+
+
+
Full-stack web application framework that uses Python and MariaDB on the server side and a tightly integrated client side library. Built for [ERPNext](https://erpnext.com)
### Table of Contents
From 00fc9c9b1c501f1858e61426efd6c0b6112dfd91 Mon Sep 17 00:00:00 2001
From: Rushabh Mehta
Date: Thu, 30 Aug 2018 12:16:10 +0530
Subject: [PATCH 51/56] fix(fetch): fetch_from will always update after save
---
frappe/model/base_document.py | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py
index 1ff5fc0d0f..fe2165974c 100644
--- a/frappe/model/base_document.py
+++ b/frappe/model/base_document.py
@@ -451,10 +451,10 @@ class BaseDocument(object):
# get a map of values ot fetch along with this link query
# that are mapped as link_fieldname.source_fieldname in Options of
# Readonly or Data or Text type fields
- fields_to_fetch = [
- _df for _df in self.meta.get_fields_to_fetch(df.fieldname)
- if not self.get(_df.fieldname)
- ]
+
+ # NOTE: All fields will be replaced, if you want manual changes to stay
+ # use `frm.add_fetch`
+ fields_to_fetch = self.meta.get_fields_to_fetch(df.fieldname)
if not fields_to_fetch:
# cache a single value type
From 624703d1b906dd056739c6d70af2e6673ce49231 Mon Sep 17 00:00:00 2001
From: Rushabh Mehta
Date: Thu, 30 Aug 2018 18:23:06 +0530
Subject: [PATCH 52/56] minor: mapping now takes optional args
---
frappe/model/mapper.py | 5 ++++-
frappe/public/js/frappe/form/layout.js | 2 +-
frappe/public/js/frappe/form/quick_entry.js | 8 ++++----
frappe/public/js/frappe/model/create_new.js | 1 +
frappe/public/js/frappe/ui/toolbar/search.js | 10 +++++++---
5 files changed, 17 insertions(+), 9 deletions(-)
diff --git a/frappe/model/mapper.py b/frappe/model/mapper.py
index 8c089f4878..273a3af6fc 100644
--- a/frappe/model/mapper.py
+++ b/frappe/model/mapper.py
@@ -9,7 +9,7 @@ from frappe.model import default_fields
from six import string_types
@frappe.whitelist()
-def make_mapped_doc(method, source_name, selected_children=None):
+def make_mapped_doc(method, source_name, selected_children=None, args=None):
'''Returns the mapped document calling the given mapper method.
Sets selected_children as flags for the `get_mapped_doc` method.
@@ -22,6 +22,9 @@ def make_mapped_doc(method, source_name, selected_children=None):
if selected_children:
selected_children = json.loads(selected_children)
+ if args:
+ frappe.flags.args = frappe._dict(json.loads(args))
+
frappe.flags.selected_children = selected_children or None
return method(source_name)
diff --git a/frappe/public/js/frappe/form/layout.js b/frappe/public/js/frappe/form/layout.js
index 0f06b67ae1..da4a00fd6d 100644
--- a/frappe/public/js/frappe/form/layout.js
+++ b/frappe/public/js/frappe/form/layout.js
@@ -316,7 +316,7 @@ frappe.ui.form.Layout = Class.extend({
fieldobj.perm = me.frm.perm;
}
}
- refresh && fieldobj.refresh && fieldobj.refresh();
+ refresh && fieldobj.df && fieldobj.refresh && fieldobj.refresh();
}
},
diff --git a/frappe/public/js/frappe/form/quick_entry.js b/frappe/public/js/frappe/form/quick_entry.js
index e733b3dda6..e7857c3bf7 100644
--- a/frappe/public/js/frappe/form/quick_entry.js
+++ b/frappe/public/js/frappe/form/quick_entry.js
@@ -60,10 +60,10 @@ frappe.ui.form.QuickEntryForm = Class.extend({
this.validate_for_prompt_autoname();
- // if (this.too_many_mandatory_fields() || this.has_child_table()
- // || !this.mandatory.length) {
- // return false;
- // }
+ if (this.has_child_table()
+ || !this.mandatory.length) {
+ return false;
+ }
return true;
},
diff --git a/frappe/public/js/frappe/model/create_new.js b/frappe/public/js/frappe/model/create_new.js
index 7878c99fac..275f23c1c8 100644
--- a/frappe/public/js/frappe/model/create_new.js
+++ b/frappe/public/js/frappe/model/create_new.js
@@ -301,6 +301,7 @@ $.extend(frappe.model, {
args: {
method: opts.method,
source_name: opts.source_name,
+ args: opts.args || null,
selected_children: opts.frm ? opts.frm.get_selected() : null
},
freeze: true,
diff --git a/frappe/public/js/frappe/ui/toolbar/search.js b/frappe/public/js/frappe/ui/toolbar/search.js
index dec4f38795..f5c7714179 100644
--- a/frappe/public/js/frappe/ui/toolbar/search.js
+++ b/frappe/public/js/frappe/ui/toolbar/search.js
@@ -288,9 +288,13 @@ frappe.search.SearchDialog = Class.extend({
}
if(result.image) {
- $result.append('');
+ $result.append('');
} else if (result.image === null) {
- $result.append(''+ frappe.get_abbr(result.label) +'
');
+ $result.append(''
+ + frappe.get_abbr(result.label) +'
');
}
var title_html = ''+ result.label +'';
@@ -303,7 +307,7 @@ frappe.search.SearchDialog = Class.extend({
if(result.route_options) {
frappe.route_options = result.route_options;
}
- $result_text.on('click', (e) => {
+ $result.on('click', (e) => {
this.search_dialog.hide();
if(result.onclick) {
result.onclick(result.match);
From a302501752f9aefcd9189fbe3f3b65f844223485 Mon Sep 17 00:00:00 2001
From: Ameya Shenoy
Date: Thu, 30 Aug 2018 15:25:10 +0530
Subject: [PATCH 53/56] webform: render image in web form using setTimeout
---
frappe/website/js/web_form_class.js | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/frappe/website/js/web_form_class.js b/frappe/website/js/web_form_class.js
index cfca46ebf6..8c1c80cd84 100644
--- a/frappe/website/js/web_form_class.js
+++ b/frappe/website/js/web_form_class.js
@@ -75,6 +75,14 @@ export default class WebForm {
if(doc) {
this.field_group.set_values(doc);
}
+
+ setTimeout(() => {
+ this.field_group.fields_list.forEach((field_instance) => {
+ if (field_instance.df.fieldtype === "Attach" && field_instance.get_value().match(".(?:jpg|gif|jpeg|png)") ){
+ field_instance.$input_wrapper.append(`
`);
+ }
+ });
+ }, 500);
}
get_values() {
From a583691d4efe604fd0ad5d5dabb6c10fd7324d3a Mon Sep 17 00:00:00 2001
From: Faris Ansari
Date: Fri, 31 Aug 2018 10:52:54 +0530
Subject: [PATCH 54/56] fix(report view): Handle non-existing fields (#6036)
---
frappe/public/js/frappe/views/reports/report_view.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frappe/public/js/frappe/views/reports/report_view.js b/frappe/public/js/frappe/views/reports/report_view.js
index 49e71eaee2..2b0214bd2d 100644
--- a/frappe/public/js/frappe/views/reports/report_view.js
+++ b/frappe/public/js/frappe/views/reports/report_view.js
@@ -719,7 +719,7 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView {
setup_columns() {
const hide_columns = ['docstatus'];
const fields = this.fields.filter(f => !hide_columns.includes(f[0]));
- this.columns = fields.map(f => this.build_column(f));
+ this.columns = fields.map(f => this.build_column(f)).filter(Boolean);
}
build_column(c) {
From 2a8e890fee47dc7f1f9c048beb0ab0d4ea0ce57f Mon Sep 17 00:00:00 2001
From: Rushabh Mehta
Date: Fri, 31 Aug 2018 15:30:30 +0530
Subject: [PATCH 55/56] enhance(testing): allow tests to be run by skipping
fixtures with --skip-before-tests and --skip-test-records
---
frappe/commands/utils.py | 8 +++++++-
frappe/test_runner.py | 15 ++++++++++-----
2 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/frappe/commands/utils.py b/frappe/commands/utils.py
index c6cddf54f8..6e13cc21e3 100644
--- a/frappe/commands/utils.py
+++ b/frappe/commands/utils.py
@@ -374,10 +374,13 @@ def console(context):
@click.option('--ui-tests', is_flag=True, default=False, help="Run UI Tests")
@click.option('--module', help="Run tests in a module")
@click.option('--profile', is_flag=True, default=False)
+@click.option('--skip-test-records', is_flag=True, default=False, help="Don't create test records")
+@click.option('--skip-before-tests', is_flag=True, default=False, help="Don't run before tests hook")
@click.option('--junit-xml-output', help="Destination file path for junit xml report")
@pass_context
def run_tests(context, app=None, module=None, doctype=None, test=(),
- driver=None, profile=False, junit_xml_output=False, ui_tests = False, doctype_list_path=None):
+ driver=None, profile=False, junit_xml_output=False, ui_tests = False,
+ doctype_list_path=None, skip_test_records=False, skip_before_tests=False):
"Run tests"
import frappe.test_runner
tests = test
@@ -385,6 +388,9 @@ def run_tests(context, app=None, module=None, doctype=None, test=(),
site = get_site(context)
frappe.init(site=site)
+ frappe.flags.skip_before_tests = skip_before_tests
+ frappe.flags.skip_test_records = skip_test_records
+
ret = frappe.test_runner.main(app, module, doctype, context.verbose, tests=tests,
force=context.force, profile=profile, junit_xml_output=junit_xml_output,
ui_tests = ui_tests, doctype_list_path = doctype_list_path)
diff --git a/frappe/test_runner.py b/frappe/test_runner.py
index af66987f3b..29fbb2f649 100644
--- a/frappe/test_runner.py
+++ b/frappe/test_runner.py
@@ -25,7 +25,8 @@ def xmlrunner_wrapper(output):
return _runner
def main(app=None, module=None, doctype=None, verbose=False, tests=(),
- force=False, profile=False, junit_xml_output=None, ui_tests=False, doctype_list_path=None):
+ force=False, profile=False, junit_xml_output=None, ui_tests=False,
+ doctype_list_path=None, skip_test_records=False):
global unittest_runner
if doctype_list_path:
@@ -55,10 +56,11 @@ def main(app=None, module=None, doctype=None, verbose=False, tests=(),
frappe.utils.scheduler.disable_scheduler()
set_test_email_config()
- if verbose:
- print('Running "before_tests" hooks')
- for fn in frappe.get_hooks("before_tests", app_name=app):
- frappe.get_attr(fn)()
+ if not frappe.flags.skip_before_tests:
+ if verbose:
+ print('Running "before_tests" hooks')
+ for fn in frappe.get_hooks("before_tests", app_name=app):
+ frappe.get_attr(fn)()
if doctype:
ret = run_tests_for_doctype(doctype, verbose, tests, force, profile)
@@ -243,6 +245,9 @@ def make_test_records(doctype, verbose=0, force=False):
if not frappe.db:
frappe.connect()
+ if frappe.flags.skip_test_records:
+ return
+
for options in get_dependencies(doctype):
if options == "[Select]":
continue
From 6221bf2f159272d5bc588077b927fcdad198fc87 Mon Sep 17 00:00:00 2001
From: Ameya Shenoy
Date: Fri, 31 Aug 2018 10:12:26 +0000
Subject: [PATCH 56/56] web_form_class: using value instead of get_value
---
frappe/website/js/web_form_class.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/frappe/website/js/web_form_class.js b/frappe/website/js/web_form_class.js
index 8c1c80cd84..e9ee2db2fa 100644
--- a/frappe/website/js/web_form_class.js
+++ b/frappe/website/js/web_form_class.js
@@ -78,7 +78,8 @@ export default class WebForm {
setTimeout(() => {
this.field_group.fields_list.forEach((field_instance) => {
- if (field_instance.df.fieldtype === "Attach" && field_instance.get_value().match(".(?:jpg|gif|jpeg|png)") ){
+ let instance_value = field_instance.value;
+ if (instance_value != null && field_instance.df.fieldtype === "Attach" && instance_value.match(".(?:jpg|gif|jpeg|png)") ){
field_instance.$input_wrapper.append(`
`);
}
});