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) { %} '; }; +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.label + '
'); + $result.append('
' + result.label + '
'); } 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(``); } });