From 450009e9172ade2c938a9a38a9e6c6bae490a521 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 30 Jul 2019 12:13:45 +0530 Subject: [PATCH 01/13] fix: added null check for contact attributes --- frappe/email/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/email/__init__.py b/frappe/email/__init__.py index 494a6e2bb3b..f99536f9a84 100644 --- a/frappe/email/__init__.py +++ b/frappe/email/__init__.py @@ -91,7 +91,7 @@ def get_cached_contacts(txt): if not txt: return contacts - match = [d for d in contacts if (d.value and (txt in d.value or txt in d.description))] + match = [d for d in contacts if (d.value and ((d.value and txt in d.value) or (d.description and txt in d.description)))] return match def update_contact_cache(contacts): From 921788474ec3c9fbf63158a7171cbe2e2173c825 Mon Sep 17 00:00:00 2001 From: Ashish Shah Date: Wed, 31 Jul 2019 10:17:19 +0530 Subject: [PATCH 02/13] Update receive.py +existing code, works fine in python 2.7 +in python 3 it breaks +In python 3 there is change in chardet module and hence the error +convert-string-to-bytes-in-python-3 +this is also fixed in v11-hotfix branch --- frappe/email/receive.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frappe/email/receive.py b/frappe/email/receive.py index dcd21d3c10d..a95975c4b0b 100644 --- a/frappe/email/receive.py +++ b/frappe/email/receive.py @@ -481,7 +481,10 @@ def get_charset(self, part): """Detect chartset.""" charset = part.get_content_charset() if not charset: - charset = chardet.detect(str(part))['encoding'] + if six.PY2: + charset = chardet.detect(str(part))['encoding'] + else: + charset = chardet.detect(part.encode())['encoding'] return charset From c56ebb69b89a17080a2e92f70dc36da3a20809d2 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Fri, 2 Aug 2019 15:30:11 +0530 Subject: [PATCH 03/13] fix: Add check for empty array --- .../js/frappe/views/reports/report_view.js | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/frappe/public/js/frappe/views/reports/report_view.js b/frappe/public/js/frappe/views/reports/report_view.js index 112ad4edde2..292ac43be7f 100644 --- a/frappe/public/js/frappe/views/reports/report_view.js +++ b/frappe/public/js/frappe/views/reports/report_view.js @@ -225,7 +225,11 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { // child table field const [cdt, _field] = fieldname.split(':'); const cdt_row = Object.keys(doc) - .filter(key => Array.isArray(doc[key]) && doc[key][0].doctype === cdt) + .filter(key => + Array.isArray(doc[key]) + && doc[key].length + && doc[key][0].doctype === cdt + ) .map(key => doc[key]) .map(a => a[0]) .filter(cdoc => cdoc.name === d[cdt + ':name'])[0]; @@ -525,15 +529,25 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { control.set_value(value); return this.set_control_value(doctype, docname, fieldname, value) .then((updated_doc) => { - const _data = this.data.find(d => d.name === updated_doc.name); + const _data = this.data + .filter(b => b.name === updated_doc.name) + .find(a => + // child table cell + (doctype != updated_doc.doctype && a[doctype + ":name"] == docname) + || doctype == updated_doc.doctype + ); + for (let field in _data) { if (field.includes(':')) { // child table field const [cdt, _field] = field.split(':'); const cdt_row = Object.keys(updated_doc) - .filter(key => Array.isArray(updated_doc[key]) && updated_doc[key][0].doctype === cdt) - .map(key => updated_doc[key]) - .map(a => a[0]) + .filter(key => + Array.isArray(updated_doc[key]) + && updated_doc[key].length + && updated_doc[key][0].doctype === cdt + ) + .map(key => updated_doc[key])[0] .filter(cdoc => cdoc.name === _data[cdt + ':name'])[0]; if (cdt_row) { _data[field] = cdt_row[_field]; From 1554c87d1fe6c8cef02057db0ed0d727cf215eb8 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Fri, 2 Aug 2019 16:00:54 +0530 Subject: [PATCH 04/13] fix: import error --- .../doctype/s3_backup_settings/s3_backup_settings.py | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.py b/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.py index d00883f5a39..6cb6891d42c 100755 --- a/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.py +++ b/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.py @@ -11,6 +11,7 @@ from frappe.model.document import Document from frappe.utils import cint, split_emails from frappe.utils.background_jobs import enqueue +from rq.timeouts import JobTimeoutException from botocore.exceptions import ClientError class S3BackupSettings(Document): From 66269d837c7f3948579f7f70d09e2d29c885df87 Mon Sep 17 00:00:00 2001 From: Sahil Khan Date: Fri, 2 Aug 2019 16:07:55 +0530 Subject: [PATCH 05/13] fix(s3_backups): iterate on objects if objects are available --- .../doctype/s3_backup_settings/s3_backup_settings.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.py b/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.py index d00883f5a39..87d08bbfbbe 100755 --- a/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.py +++ b/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.py @@ -162,8 +162,9 @@ def delete_old_backups(limit, bucket): ) bucket = s3.Bucket(bucket) objects = bucket.meta.client.list_objects_v2(Bucket=bucket.name, Delimiter='/') - for obj in objects.get('CommonPrefixes'): - all_backups.append(obj.get('Prefix')) + if objects: + for obj in objects.get('CommonPrefixes'): + all_backups.append(obj.get('Prefix')) oldest_backup = sorted(all_backups)[0] From 8ba1b7137e5d8d64fbc6d0d7d74484c2e713af57 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Fri, 2 Aug 2019 21:45:19 +0530 Subject: [PATCH 06/13] chore: Enable few eslint rules to enforce consistent code (#8082) --- .eslintrc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.eslintrc b/.eslintrc index eadbd5eb526..7719dfaec06 100644 --- a/.eslintrc +++ b/.eslintrc @@ -51,7 +51,11 @@ ], "no-control-regex": [ "off" - ] + ], + "space-before-blocks": "warn", + "keyword-spacing": "warn", + "comma-spacing": "warn", + "key-spacing": "warn", }, "root": true, "globals": { From b23fea9d177ffb01c8853cad3db348a8b7c6e413 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Sat, 3 Aug 2019 21:42:52 +0530 Subject: [PATCH 07/13] fix(link-preview): Get preview fields on server side - Show a fallback image if image URL is invalid - Fixes unexpected "Unknown column" errors --- frappe/boot.py | 4 + frappe/desk/link_preview.py | 47 ++++--- frappe/public/images/fallback-thumbnail.jpg | Bin 0 -> 2598 bytes frappe/public/js/frappe/ui/link_preview.js | 145 +++++++------------- 4 files changed, 84 insertions(+), 112 deletions(-) create mode 100644 frappe/public/images/fallback-thumbnail.jpg diff --git a/frappe/boot.py b/frappe/boot.py index efa9ac2afe2..50888fcdd2f 100644 --- a/frappe/boot.py +++ b/frappe/boot.py @@ -82,6 +82,7 @@ def get_bootinfo(): bootinfo.energy_points_enabled = is_energy_point_enabled() bootinfo.points = get_energy_points(frappe.session.user) bootinfo.frequently_visited_links = frequently_visited_links() + bootinfo.link_preview_doctypes = get_link_preview_doctypes() return bootinfo @@ -262,3 +263,6 @@ def get_gsuite_status(): def get_success_action(): return frappe.get_all("Success Action", fields=["*"]) + +def get_link_preview_doctypes(): + return [d.name for d in frappe.db.get_all('DocType', {'show_preview_popup': 1})] \ No newline at end of file diff --git a/frappe/desk/link_preview.py b/frappe/desk/link_preview.py index f8252f20bca..f82a83a6737 100644 --- a/frappe/desk/link_preview.py +++ b/frappe/desk/link_preview.py @@ -3,26 +3,41 @@ import json @frappe.whitelist() -def get_preview_data(doctype, docname, fields): - fields = json.loads(fields) - preview_fields = [field['name'] for field in fields if field['type'] not in no_value_fields] - preview_fields.append(frappe.get_meta(doctype).get_title_field()) - if 'name' not in fields: - preview_fields.append('name') - preview_fields.append(frappe.get_meta(doctype).image_field) +def get_preview_data(doctype, docname): + preview_fields = [] + meta = frappe.get_meta(doctype) + if not meta.show_preview_popup: return + + preview_fields = [field.fieldname for field in meta.fields \ + if field.in_preview and field.fieldtype not in no_value_fields] + + # no preview fields defined, build list from mandatory fields + if not preview_fields: + preview_fields = [field.name for field in meta.fields if field.reqd] + + title_field = meta.get_title_field() + image_field = meta.image_field + + preview_fields.append(title_field) + preview_fields.append(image_field) + preview_fields.append('name') preview_data = frappe.get_list(doctype, filters={ 'name': docname }, fields=preview_fields, limit=1) - if preview_data: - preview_data = preview_data[0] - preview_data = {k: v for k, v in preview_data.items() if v is not None} - for k,v in preview_data.items(): - if frappe.get_meta(doctype).has_field(k): - preview_data[k] = frappe.format(v,frappe.get_meta(doctype).get_field(k).fieldtype) + if not preview_data: return + + preview_data = preview_data[0] + + formatted_preview_data = { + 'preview_image': preview_data.get(image_field), + 'preview_title': preview_data.get(title_field), + 'name': preview_data.get('name') + } - if not preview_data: - return None - return preview_data + for key, val in preview_data.items(): + if val and meta.has_field(key): + formatted_preview_data[meta.get_field(key).label] = frappe.format(val, meta.get_field(key).fieldtype) + return formatted_preview_data \ No newline at end of file diff --git a/frappe/public/images/fallback-thumbnail.jpg b/frappe/public/images/fallback-thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..68a62d776670f9e75147832597cdc5e24f4392ff GIT binary patch literal 2598 zcmex=w1Lnf z)YQ%th(f)iy`VGld;u5&{s|y115ncA z?A!Pa3>;k5U;#GE?&m#0(;lD*2%Ng*`0NWq!*ZzkGxpgOW?WGvrYFv#atAsPKB%z?r5Dw3XK4h+1uNc;l~3~&RUu4`am za0-Ds{xr~3uGwIt*(?))p#%-OPalC|{P94MK@RwV=~@Jmc9C5QPSH#P$U+0nX2#=E z=0WFDLjeXRMkZE9c4lA+0S-DwAU#o7BrqtLl|@iU!N4#;z{o*S$+6IBK~m#FXc59_ z&+wnYC+Wn#cdPHOTobV~=xevQR@}yz?iZl^}M?Q2!O=X+BY z-ub>}iuJs&liG{#Z3=i-ea%bueAP+ko$n*5rsUsVgVs#X3pM${j8O_E_H!?DgiV>t ze(bA(=ptt47Zs1+zdPdiccMd+y*P@K&)d9JRIIzdBXrbw14qqt(p!IKH4nOs(EkGpP#qJNF~3gOC2^uk>d=e0^&v4$_<#hJ{}d! HP!%@;F { + this.element.on('change', () => { this.new_popover = true; }); - if(!this.popover || this.new_popover) { - this.get_preview_fields().then(preview_fields => { - if(preview_fields.length) { - this.data_timeout = setTimeout(() => { - this.create_popover(e, preview_fields); - }, 100); - } - }); + if (!this.popover || this.new_popover) { + this.data_timeout = setTimeout(() => { + this.create_popover(e); + }, 100); + } else { this.popover_timeout = setTimeout(() => { if (this.element.is(':focus')) { @@ -61,20 +61,20 @@ frappe.ui.LinkPreview = class { } } - create_popover(e, preview_fields) { + create_popover(e) { this.new_popover = false; if (this.element.is(':focus')) { return; } - this.get_preview_fields_value(preview_fields).then((preview_data)=> { - if(preview_data) { - if(this.popover_timeout) { + this.get_preview_data().then(preview_data => { + if (preview_data) { + if (this.popover_timeout) { clearTimeout(this.popover_timeout); } this.popover_timeout = setTimeout(() => { - if(this.popover) { + if (this.popover) { let new_content = this.get_popover_html(preview_data); this.popover.options.content = new_content; } else { @@ -88,16 +88,15 @@ frappe.ui.LinkPreview = class { } show_popover(e) { - - this.default_timeout = setTimeout(()=> { + this.default_timeout = setTimeout(() => { this.clear_all_popovers(); }, 10000); - if(!this.is_link) { + if (!this.is_link) { var left = e.pageX; this.element.popover('show'); var width = $('.popover').width(); - $('.control-field-popover').css('left', (left-(width/2)) + 'px'); + $('.control-field-popover').css('left', (left - (width / 2)) + 'px'); } else { this.element.popover('show'); } @@ -109,14 +108,14 @@ frappe.ui.LinkPreview = class { if (!$('.popover:hover').length) { this.link_hovered = false; } - if(!this.link_hovered) { - if(this.data_timeout) { + if (!this.link_hovered) { + if (this.data_timeout) { clearTimeout(this.data_timeout); } if (this.popover_timeout) { clearTimeout(this.popover_timeout); } - if(this.default_timeout) { + if (this.default_timeout) { clearTimeout(this.default_timeout); } this.clear_all_popovers(); @@ -132,45 +131,10 @@ frappe.ui.LinkPreview = class { this.popovers_list.forEach($el => $el.hide()); } - get_preview_fields() { - return new Promise((resolve) => { - let dt = this.doctype; - let fields = []; - frappe.model.with_doctype(dt, () => { - let meta = frappe.get_meta(dt); - let meta_fields = meta.fields; - - if (!meta.show_preview_popup) { - // no preview - resolve([]); - return; - } - - meta_fields.filter((field) => { - // build list of fields to fetch - if(field.in_preview) { - fields.push({'name':field.fieldname,'type':field.fieldtype}); - } - }); - - // no preview fields defined, build list from mandatory fields - if(!fields.length) { - meta_fields.filter((field) => { - if(field.reqd) { - fields.push({'name':field.fieldname,'type':field.fieldtype}); - } - }); - } - resolve(fields); - }); - }); - } - - get_preview_fields_value(field_list) { + get_preview_data() { return frappe.xcall('frappe.desk.link_preview.get_preview_data', { 'doctype': this.doctype, 'docname': this.name, - 'fields': field_list, }); } @@ -195,56 +159,51 @@ frappe.ui.LinkPreview = class { } get_popover_html(preview_data) { - if(!this.href) { + if (!this.href) { this.href = window.location.href; } - if(this.href && this.href.includes(' ')) { + if (this.href && this.href.includes(' ')) { this.href = this.href.replace(new RegExp(' ', 'g'), '%20'); } let image_html = ''; let id_html = ''; let content_html = ''; - let meta = frappe.get_meta(this.doctype); - let title = preview_data.title; - if(preview_data[meta.image_field]) { - let image_url = encodeURI(preview_data[meta.image_field]); - image_html += ` -
- -
`; + if (preview_data.preview_image) { + let image_url = encodeURI(preview_data.preview_image); + image_html = ` +
+ +
+ `; } - - if(title && title != preview_data.name) { - id_html+= `${preview_data.name}`; - } - if(!title) { - title = preview_data.name; + if (preview_data.preview_title != preview_data.name) { + id_html = `${preview_data.name}`; } Object.keys(preview_data).forEach(key => { - if(key!=meta.image_field && key!='name' && key!=meta.title_field) { - let value = this.truncate_value(preview_data[key]); - let label = this.truncate_value(frappe.meta.get_label(this.doctype, key)); - content_html += ` -
-
${label}
-
${value}
-
+ if (!['preview_image', 'preview_title', 'name'].includes(key)) { + let value = frappe.ellipsis(preview_data[key], 280); + let label = key; + content_html = ` +
+
+
${label}
+
${value}
+
+
`; } }); - content_html = `
${content_html}
`; - - let popover_content = - `
${image_html} + let popover_content =` +
${image_html}
- ${title} + ${preview_data.preview_title} ${this.doctype} ${id_html}
@@ -252,16 +211,10 @@ frappe.ui.LinkPreview = class {
${content_html} -
`; +
+ `; return popover_content; } - truncate_value(value) { - if (value.length > 280) { - value = value.slice(0,280) + '...'; - } - return value; - } - }; From 19bc548fdf1ef5d04cc3931c97b60772bb51abb2 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Sun, 4 Aug 2019 10:10:40 +0530 Subject: [PATCH 08/13] fix: Data in preview table --- frappe/desk/link_preview.py | 4 ++-- frappe/public/js/frappe/ui/link_preview.js | 11 +++++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/frappe/desk/link_preview.py b/frappe/desk/link_preview.py index f82a83a6737..402883a3ade 100644 --- a/frappe/desk/link_preview.py +++ b/frappe/desk/link_preview.py @@ -33,11 +33,11 @@ def get_preview_data(doctype, docname): formatted_preview_data = { 'preview_image': preview_data.get(image_field), 'preview_title': preview_data.get(title_field), - 'name': preview_data.get('name') + 'name': preview_data.get('name'), } for key, val in preview_data.items(): - if val and meta.has_field(key): + if val and meta.has_field(key) and key not in [image_field, title_field, 'name']: formatted_preview_data[meta.get_field(key).label] = frappe.format(val, meta.get_field(key).fieldtype) return formatted_preview_data \ No newline at end of file diff --git a/frappe/public/js/frappe/ui/link_preview.js b/frappe/public/js/frappe/ui/link_preview.js index fe3cdfab525..71e92ba29dc 100644 --- a/frappe/public/js/frappe/ui/link_preview.js +++ b/frappe/public/js/frappe/ui/link_preview.js @@ -188,16 +188,15 @@ frappe.ui.LinkPreview = class { if (!['preview_image', 'preview_title', 'name'].includes(key)) { let value = frappe.ellipsis(preview_data[key], 280); let label = key; - content_html = ` -
-
-
${label}
-
${value}
-
+ content_html += ` +
+
${label}
+
${value}
`; } }); + content_html = `
${content_html}
`; let popover_content =`
${image_html} From 53def1a7c332f47867dd3df2ee6834b5fc4a7197 Mon Sep 17 00:00:00 2001 From: Ernesto Ruiz Date: Mon, 5 Aug 2019 01:36:48 -0600 Subject: [PATCH 09/13] Fix: Add translation function to strings (#8023) --- .../core/doctype/data_import/data_import.py | 2 +- .../page/background_jobs/background_jobs.html | 20 ++++----- .../page/background_jobs/background_jobs.js | 2 +- frappe/templates/includes/login/login.js | 42 +++++++++---------- 4 files changed, 33 insertions(+), 33 deletions(-) diff --git a/frappe/core/doctype/data_import/data_import.py b/frappe/core/doctype/data_import/data_import.py index dc2f9194b92..5500f1c617f 100644 --- a/frappe/core/doctype/data_import/data_import.py +++ b/frappe/core/doctype/data_import/data_import.py @@ -15,7 +15,7 @@ class DataImport(Document): def autoname(self): if not self.name: - self.name = "Import on "+ format_datetime(self.creation) + self.name = "Import on " +format_datetime(self.creation) def validate(self): if not self.import_file: diff --git a/frappe/core/page/background_jobs/background_jobs.html b/frappe/core/page/background_jobs/background_jobs.html index 07b5c164516..14b50d03880 100644 --- a/frappe/core/page/background_jobs/background_jobs.html +++ b/frappe/core/page/background_jobs/background_jobs.html @@ -3,9 +3,9 @@ - - - + + + @@ -28,13 +28,13 @@
Queue / WorkerJobCreated{{ _("Queue / Worker") }}{{ _("Job") }}{{ _("Created") }}

- Started - Queued - Failed - Finished + {{ _("Started") }} + {{ _("Queued") }} + {{ _("Failed") }} + {{ _("Finished") }}

{% else %} -

No pending or current jobs for this site

+

{{ _("No pending or current jobs for this site") }}

{% endif %} -

Last refreshed {{ frappe.datetime.now_datetime() }}

-
\ No newline at end of file +

{{ _("Last refreshed") }} {{ frappe.datetime.now_datetime() }}

+
diff --git a/frappe/core/page/background_jobs/background_jobs.js b/frappe/core/page/background_jobs/background_jobs.js index 2bde8454a9b..bbc8bf049b3 100644 --- a/frappe/core/page/background_jobs/background_jobs.js +++ b/frappe/core/page/background_jobs/background_jobs.js @@ -1,7 +1,7 @@ frappe.pages['background_jobs'].on_page_load = function(wrapper) { var page = frappe.ui.make_app_page({ parent: wrapper, - title: 'Background Jobs', + title: __('Background Jobs'), single_column: true }); diff --git a/frappe/templates/includes/login/login.js b/frappe/templates/includes/login/login.js index 519a49220a9..63ec6588e5b 100644 --- a/frappe/templates/includes/login/login.js +++ b/frappe/templates/includes/login/login.js @@ -21,7 +21,7 @@ login.bind_events = function() { args.pwd = $("#login_password").val(); args.device = "desktop"; if(!args.usr || !args.pwd) { - frappe.msgprint("{{ _("Both login and password required") }}"); + frappe.msgprint('{{ _("Both login and password required") }}'); return false; } login.call(args); @@ -36,7 +36,7 @@ login.bind_events = function() { args.redirect_to = frappe.utils.get_url_arg("redirect-to") || ''; args.full_name = ($("#signup_fullname").val() || "").trim(); if(!args.email || !validate_email(args.email) || !args.full_name) { - login.set_indicator("{{ _("Valid email and name required") }}", 'red'); + login.set_indicator('{{ _("Valid email and name required") }}', 'red'); return false; } login.call(args); @@ -49,7 +49,7 @@ login.bind_events = function() { args.cmd = "frappe.core.doctype.user.user.reset_password"; args.user = ($("#forgot_email").val() || "").trim(); if(!args.user) { - login.set_indicator("{{ _("Valid Login id required.") }}", 'red'); + login.set_indicator('{{ _("Valid Login id required.") }}', 'red'); return false; } login.call(args); @@ -74,7 +74,7 @@ login.bind_events = function() { args.pwd = $("#login_password").val(); args.device = "desktop"; if(!args.usr || !args.pwd) { - login.set_indicator("{{ _("Both login and password required") }}", 'red'); + login.set_indicator('{{ _("Both login and password required") }}', 'red'); return false; } login.call(args); @@ -125,7 +125,7 @@ login.signup = function() { // Login login.call = function(args, callback) { - login.set_indicator("{{ _('Verifying...') }}", 'blue'); + login.set_indicator('{{ _("Verifying...") }}', 'blue'); return frappe.call({ type: "POST", @@ -172,7 +172,7 @@ login.login_handlers = (function() { var login_handlers = { 200: function(data) { if(data.message == 'Logged In'){ - login.set_indicator("{{ _("Success") }}", 'green'); + login.set_indicator('{{ _("Success") }}', 'green'); window.location.href = frappe.utils.get_url_arg("redirect-to") || data.home_page; } else if(data.message == 'Password Reset'){ window.location.href = data.redirect_to; @@ -196,13 +196,13 @@ login.login_handlers = (function() { } } else if(window.location.hash === '#forgot') { if(data.message==='not found') { - login.set_indicator("{{ _("Not a valid user") }}", 'red'); + login.set_indicator('{{ _("Not a valid user") }}', 'red'); } else if (data.message=='not allowed') { - login.set_indicator("{{ _("Not Allowed") }}", 'red'); + login.set_indicator('{{ _("Not Allowed") }}', 'red'); } else if (data.message=='disabled') { - login.set_indicator("{{ _("Not Allowed: Disabled User") }}", 'red'); + login.set_indicator('{{ _("Not Allowed: Disabled User") }}', 'red'); } else { - login.set_indicator("{{ _("Instructions Emailed") }}", 'green'); + login.set_indicator('{{ _("Instructions Emailed") }}', 'green'); } @@ -210,7 +210,7 @@ login.login_handlers = (function() { if(cint(data.message[0])==0) { login.set_indicator(data.message[1], 'red'); } else { - login.set_indicator("{{ _('Success') }}", 'green'); + login.set_indicator('{{ _("Success") }}', 'green'); frappe.msgprint(data.message[1]) } //login.set_indicator(__(data.message), 'green'); @@ -218,7 +218,7 @@ login.login_handlers = (function() { //OTP verification if(data.verification && data.message != 'Logged In') { - login.set_indicator("{{ _("Success") }}", 'green'); + login.set_indicator('{{ _("Success") }}', 'green'); document.cookie = "tmp_id="+data.tmp_id; @@ -231,8 +231,8 @@ login.login_handlers = (function() { } } }, - 401: get_error_handler("{{ _("Invalid Login. Try again.") }}"), - 417: get_error_handler("{{ _("Oops! Something went wrong") }}") + 401: get_error_handler('{{ _("Invalid Login. Try again.") }}'), + 417: get_error_handler('{{ _("Oops! Something went wrong") }}') }; return login_handlers; @@ -272,11 +272,11 @@ var request_otp = function(r){ $('.login-content').empty().append($('
').attr({'id':'twofactor_div'}).html( '
\
\ - Verification\ + {{ _("Verification") }}\
\
\ - \ - \ + \ + \
')); // add event handler for submit button verify_token(); @@ -287,11 +287,11 @@ var continue_otp_app = function(setup, qrcode){ var qrcode_div = $('
'); if (setup){ - direction = $('
').attr('id','qr_info').text('Enter Code displayed in OTP App.'); + direction = $('
').attr('id','qr_info').text('{{ _("Enter Code displayed in OTP App.") }}'); qrcode_div.append(direction); $('#otp_div').prepend(qrcode_div); } else { - direction = $('
').attr('id','qr_info').text('OTP setup using OTP App was not completed. Please contact Administrator.'); + direction = $('
').attr('id','qr_info').text('{{ _("OTP setup using OTP App was not completed. Please contact Administrator.") }}'); qrcode_div.append(direction); $('#otp_div').prepend(qrcode_div); } @@ -305,7 +305,7 @@ var continue_sms = function(setup, prompt){ sms_div.append(prompt) $('#otp_div').prepend(sms_div); } else { - direction = $('
').attr('id','qr_info').text(prompt || 'SMS was not sent. Please contact Administrator.'); + direction = $('
').attr('id','qr_info').text(prompt || '{{ _("SMS was not sent. Please contact Administrator.") }}'); sms_div.append(direction); $('#otp_div').prepend(sms_div) } @@ -319,7 +319,7 @@ var continue_email = function(setup, prompt){ email_div.append(prompt) $('#otp_div').prepend(email_div); } else { - var direction = $('
').attr('id','qr_info').text(prompt || 'Verification code email not sent. Please contact Administrator.'); + var direction = $('
').attr('id','qr_info').text(prompt || '{{ _("Verification code email not sent. Please contact Administrator.") }}'); email_div.append(direction); $('#otp_div').prepend(email_div); } From b7edf70585efe27c6a445eeb72d639970ebfe746 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Mon, 5 Aug 2019 17:02:08 +0530 Subject: [PATCH 10/13] fix: Use text-light instead of text-color for timeline text Since timeline text is not the primary content on the form, use lighter color for texts in timeline --- frappe/public/less/form.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/less/form.less b/frappe/public/less/form.less index c82479c3018..7649c0c5e8b 100644 --- a/frappe/public/less/form.less +++ b/frappe/public/less/form.less @@ -363,7 +363,7 @@ h6.uppercase, .h6.uppercase { margin-top: 0px; b { - color: @text-color !important; + color: @text-light !important; } blockquote { From f93fbadd47dccd90fa3f229879edfe3e58230b0e Mon Sep 17 00:00:00 2001 From: Aditya Hase Date: Wed, 7 Aug 2019 13:22:53 +0530 Subject: [PATCH 11/13] fix(comments): Remove size restriction on _comments column Use LONGTEXT (2^32 - 1 bytes) instead of TEXT (2^16 - 1 bytes) data type --- frappe/model/db_schema.py | 2 +- frappe/patches.txt | 3 ++- .../change_comments_column_data_type_to_longtext.py | 11 +++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 frappe/patches/v12_0/change_comments_column_data_type_to_longtext.py diff --git a/frappe/model/db_schema.py b/frappe/model/db_schema.py index 16ccf284d57..94cfc36c219 100644 --- a/frappe/model/db_schema.py +++ b/frappe/model/db_schema.py @@ -228,7 +228,7 @@ def get_columns_from_docfields(self): for fieldname in optional_columns: fl.append({ "fieldname": fieldname, - "fieldtype": "Text" + "fieldtype": "Long Text" }) # add _seen column if track_seen diff --git a/frappe/patches.txt b/frappe/patches.txt index 0d5ccfcb8ec..263e5021660 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -248,4 +248,5 @@ frappe.patches.v12_0.move_form_attachments_to_attachments_folder frappe.patches.v12_0.move_timeline_links_to_dynamic_links frappe.patches.v12_0.delete_feedback_request_if_exists #1 frappe.patches.v12_0.rename_events_repeat_on -frappe.patches.v12_0.fix_public_private_files \ No newline at end of file +frappe.patches.v12_0.fix_public_private_files +frappe.patches.v12_0.change_comments_column_data_type_to_longtext \ No newline at end of file diff --git a/frappe/patches/v12_0/change_comments_column_data_type_to_longtext.py b/frappe/patches/v12_0/change_comments_column_data_type_to_longtext.py new file mode 100644 index 00000000000..8548fe86a63 --- /dev/null +++ b/frappe/patches/v12_0/change_comments_column_data_type_to_longtext.py @@ -0,0 +1,11 @@ +import frappe +from frappe.core.utils import find + +def execute(): + if frappe.db.db_type != "postgres": + doctypes = frappe.get_all("DocType") + for doctype in doctypes: + columns = frappe.db.get_table_columns_description("tab{}".format(doctype.name)) + comments_column = find(columns, lambda x: x.name == "_comments") + if comments_column and comments_column.type != "longtext": + frappe.db.sql("ALTER TABLE `tab{}` MODIFY _comments LONGTEXT".format(doctype.name)) From a4317fff54f48544cdaae83807a69b451be7318d Mon Sep 17 00:00:00 2001 From: Aditya Hase Date: Wed, 7 Aug 2019 15:47:05 +0530 Subject: [PATCH 12/13] Revert " fix(comments): Remove size restriction on _comments column" --- frappe/model/db_schema.py | 2 +- frappe/patches.txt | 3 +-- .../change_comments_column_data_type_to_longtext.py | 11 ----------- 3 files changed, 2 insertions(+), 14 deletions(-) delete mode 100644 frappe/patches/v12_0/change_comments_column_data_type_to_longtext.py diff --git a/frappe/model/db_schema.py b/frappe/model/db_schema.py index 94cfc36c219..16ccf284d57 100644 --- a/frappe/model/db_schema.py +++ b/frappe/model/db_schema.py @@ -228,7 +228,7 @@ def get_columns_from_docfields(self): for fieldname in optional_columns: fl.append({ "fieldname": fieldname, - "fieldtype": "Long Text" + "fieldtype": "Text" }) # add _seen column if track_seen diff --git a/frappe/patches.txt b/frappe/patches.txt index 263e5021660..0d5ccfcb8ec 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -248,5 +248,4 @@ frappe.patches.v12_0.move_form_attachments_to_attachments_folder frappe.patches.v12_0.move_timeline_links_to_dynamic_links frappe.patches.v12_0.delete_feedback_request_if_exists #1 frappe.patches.v12_0.rename_events_repeat_on -frappe.patches.v12_0.fix_public_private_files -frappe.patches.v12_0.change_comments_column_data_type_to_longtext \ No newline at end of file +frappe.patches.v12_0.fix_public_private_files \ No newline at end of file diff --git a/frappe/patches/v12_0/change_comments_column_data_type_to_longtext.py b/frappe/patches/v12_0/change_comments_column_data_type_to_longtext.py deleted file mode 100644 index 8548fe86a63..00000000000 --- a/frappe/patches/v12_0/change_comments_column_data_type_to_longtext.py +++ /dev/null @@ -1,11 +0,0 @@ -import frappe -from frappe.core.utils import find - -def execute(): - if frappe.db.db_type != "postgres": - doctypes = frappe.get_all("DocType") - for doctype in doctypes: - columns = frappe.db.get_table_columns_description("tab{}".format(doctype.name)) - comments_column = find(columns, lambda x: x.name == "_comments") - if comments_column and comments_column.type != "longtext": - frappe.db.sql("ALTER TABLE `tab{}` MODIFY _comments LONGTEXT".format(doctype.name)) From 99cacb76f7665cfe78960d1b4677ee8c69d778da Mon Sep 17 00:00:00 2001 From: Sahil Khan Date: Wed, 7 Aug 2019 16:39:54 +0550 Subject: [PATCH 13/13] bumped to version 12.0.5 --- frappe/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index afd60366820..91a247b9f98 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -23,7 +23,7 @@ reload(sys) sys.setdefaultencoding("utf-8") -__version__ = '12.0.4' +__version__ = '12.0.5' __title__ = "Frappe Framework" local = Local()