From 23b3f65b3bae0c04177c9a670e8f0af5d06be13a Mon Sep 17 00:00:00 2001 From: "Chinmay D. Pai" Date: Thu, 16 Apr 2020 14:09:59 +0530 Subject: [PATCH 01/62] fix: limit file upload mimetype if user has no desk access limits file upload mimetype to jpg, png, and pdf in case the user does not have desk access, to prevent abuse of the servers as a file storage system Signed-off-by: Chinmay D. Pai --- frappe/handler.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frappe/handler.py b/frappe/handler.py index 6e0bf7a6be..d3fec3cf8f 100755 --- a/frappe/handler.py +++ b/frappe/handler.py @@ -148,12 +148,14 @@ def uploadfile(): @frappe.whitelist(allow_guest=True) def upload_file(): + user = None if frappe.session.user == 'Guest': if frappe.get_system_settings('allow_guests_to_upload_files'): ignore_permissions = True else: return else: + user = frappe.get_doc("User", frappe.session.user) ignore_permissions = False files = frappe.request.files @@ -175,7 +177,7 @@ def upload_file(): frappe.local.uploaded_file = content frappe.local.uploaded_filename = filename - if frappe.session.user == 'Guest': + if frappe.session.user == 'Guest' or (user and not user.has_desk_access()): import mimetypes filetype = mimetypes.guess_type(filename)[0] if filetype not in ['image/png', 'image/jpeg', 'application/pdf']: From d7e9ef60b87ba8c947d2ce89f3c645691dd95bc4 Mon Sep 17 00:00:00 2001 From: "Chinmay D. Pai" Date: Thu, 16 Apr 2020 14:31:25 +0530 Subject: [PATCH 02/62] fix: add support for more document mimetypes Signed-off-by: Chinmay D. Pai --- frappe/handler.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/frappe/handler.py b/frappe/handler.py index d3fec3cf8f..9699ff6d44 100755 --- a/frappe/handler.py +++ b/frappe/handler.py @@ -14,6 +14,12 @@ from frappe.core.doctype.server_script.server_script_utils import run_server_scr from werkzeug.wrappers import Response from six import string_types +ALLOWED_MIMETYPES = ('image/png', 'image/jpeg', 'application/pdf', 'application/msword', + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'application/vnd.oasis.opendocument.text', 'application/vnd.oasis.opendocument.spreadsheet') + + def handle(): """handle request""" validate_auth() @@ -180,8 +186,8 @@ def upload_file(): if frappe.session.user == 'Guest' or (user and not user.has_desk_access()): import mimetypes filetype = mimetypes.guess_type(filename)[0] - if filetype not in ['image/png', 'image/jpeg', 'application/pdf']: - frappe.throw("You can only upload JPG, PNG or PDF files.") + if filetype not in ALLOWED_MIMETYPES: + frappe.throw("You can only upload JPG, PNG, PDF, or Microsoft documents.") if method: method = frappe.get_attr(method) From 6b5cd30b720a851934c2e6763325d771c0f95b66 Mon Sep 17 00:00:00 2001 From: Kenneth Sequeira Date: Wed, 22 Apr 2020 08:52:28 +0530 Subject: [PATCH 03/62] check preview render --- frappe/website/doctype/blog_post/blog_post.py | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py index 148ba15be7..82d5d54bbd 100644 --- a/frappe/website/doctype/blog_post/blog_post.py +++ b/frappe/website/doctype/blog_post/blog_post.py @@ -37,6 +37,8 @@ class BlogPost(WebsiteGenerator): if self.published and not self.published_on: self.published_on = today() + + # self.goog_preview = render_seo_section(doc) # update posts frappe.db.sql("""UPDATE `tabBlogger` SET `posts`=(SELECT COUNT(*) FROM `tabBlog Post` @@ -65,7 +67,11 @@ class BlogPost(WebsiteGenerator): context.content = get_html_content_based_on_type(self, 'content', self.content_type) - context.description = self.blog_intro or strip_html_tags(context.content[:140]) + + if self.meta_description: + context.description = self.meta_description + else: + context.description = self.blog_intro or strip_html_tags(context.content[:140]) context.metatags = { "name": self.title, @@ -73,9 +79,12 @@ class BlogPost(WebsiteGenerator): } image = find_first_image(context.content) - if image: + if self.meta_image: + context.metatags["image"] = self.meta_image + else: context.metatags["image"] = image + self.load_comments(context) context.category = frappe.db.get_value("Blog Category", @@ -94,6 +103,18 @@ class BlogPost(WebsiteGenerator): context.comment_text = _('1 comment') else: context.comment_text = _('{0} comments').format(len(context.comment_list)) + + #render google SERP preview + + '''def render_seo_section(doc): + return frappe.render_template(""" +

doc.title

+

{{ url }}

+ {% if doc.meta_description %} +

{{ doc.meta_description }}

+ {%- else %}

{{ doc.description }}

+ {% endif %} + """) ''' def get_list_context(context=None): From b8101cb0ee982dbf29765190d4afba8d904440d4 Mon Sep 17 00:00:00 2001 From: Kenneth Sequeira Date: Wed, 22 Apr 2020 08:58:49 +0530 Subject: [PATCH 04/62] fix: blog intro in blog post render --- frappe/website/doctype/blog_post/templates/blog_post.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/website/doctype/blog_post/templates/blog_post.html b/frappe/website/doctype/blog_post/templates/blog_post.html index 285223a2af..ab3c2afa1a 100644 --- a/frappe/website/doctype/blog_post/templates/blog_post.html +++ b/frappe/website/doctype/blog_post/templates/blog_post.html @@ -15,7 +15,7 @@

- {{ description }} + {{ blog_intro }}

{{ content }} From 7c5d6dd9595b69f52fb3713cfad032efdf3759e1 Mon Sep 17 00:00:00 2001 From: Kenneth Sequeira Date: Wed, 22 Apr 2020 16:30:50 +0530 Subject: [PATCH 05/62] Google SERP Preview: First Cut --- frappe/website/doctype/blog_post/blog_post.js | 20 +++++++++- .../website/doctype/blog_post/blog_post.json | 39 ++++++++++++++++++- frappe/website/doctype/blog_post/blog_post.py | 16 +------- 3 files changed, 58 insertions(+), 17 deletions(-) diff --git a/frappe/website/doctype/blog_post/blog_post.js b/frappe/website/doctype/blog_post/blog_post.js index e1b8341139..3668748b74 100644 --- a/frappe/website/doctype/blog_post/blog_post.js +++ b/frappe/website/doctype/blog_post/blog_post.js @@ -3,6 +3,24 @@ frappe.ui.form.on('Blog Post', { refresh: function(frm) { - + frm.call('get_url').then((r)=>{ + let google_preview = frm.get_field("google_preview") + google_preview.html(` + + + ${ r.message + '/' + frm.doc.route } +

+ ${ frm.doc.title }

+ ${ frm.doc.published_on } ${frm.doc.meta_description} + `) + }) } }); diff --git a/frappe/website/doctype/blog_post/blog_post.json b/frappe/website/doctype/blog_post/blog_post.json index 9944cbf4b2..d7f04e2442 100644 --- a/frappe/website/doctype/blog_post/blog_post.json +++ b/frappe/website/doctype/blog_post/blog_post.json @@ -21,7 +21,13 @@ "content", "content_md", "content_html", - "email_sent" + "email_sent", + "seo_section", + "meta_description", + "column_break_18", + "meta_image", + "section_break_20", + "google_preview" ], "fields": [ { @@ -123,6 +129,35 @@ "fieldname": "disable_comments", "fieldtype": "Check", "label": "Disable Comments" + }, + { + "fieldname": "seo_section", + "fieldtype": "Section Break", + "label": "SEO Section" + }, + { + "fieldname": "meta_description", + "fieldtype": "Small Text", + "label": "Meta Description" + }, + { + "fieldname": "column_break_18", + "fieldtype": "Column Break" + }, + { + "fieldname": "meta_image", + "fieldtype": "Attach Image", + "label": "Meta Image" + }, + { + "fieldname": "section_break_20", + "fieldtype": "Section Break" + }, + { + "fieldname": "google_preview", + "fieldtype": "HTML", + "label": "Google Snippet Preview", + "read_only": 1 } ], "has_web_view": 1, @@ -131,7 +166,7 @@ "is_published_field": "published", "links": [], "max_attachments": 5, - "modified": "2020-04-08 19:58:13.672332", + "modified": "2020-04-22 12:27:40.724507", "modified_by": "Administrator", "module": "Website", "name": "Blog Post", diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py index 82d5d54bbd..f71f1d3d5b 100644 --- a/frappe/website/doctype/blog_post/blog_post.py +++ b/frappe/website/doctype/blog_post/blog_post.py @@ -38,8 +38,6 @@ class BlogPost(WebsiteGenerator): if self.published and not self.published_on: self.published_on = today() - # self.goog_preview = render_seo_section(doc) - # update posts frappe.db.sql("""UPDATE `tabBlogger` SET `posts`=(SELECT COUNT(*) FROM `tabBlog Post` WHERE IFNULL(`blogger`,'')=`tabBlogger`.`name`) @@ -104,18 +102,8 @@ class BlogPost(WebsiteGenerator): else: context.comment_text = _('{0} comments').format(len(context.comment_list)) - #render google SERP preview - - '''def render_seo_section(doc): - return frappe.render_template(""" -

doc.title

-

{{ url }}

- {% if doc.meta_description %} -

{{ doc.meta_description }}

- {%- else %}

{{ doc.description }}

- {% endif %} - """) ''' - + def get_url(self): + return frappe.utils.get_url() def get_list_context(context=None): list_context = frappe._dict( From 2425217a4d7d8661918e3602900e17e5b51f4e75 Mon Sep 17 00:00:00 2001 From: Kenneth Sequeira Date: Wed, 22 Apr 2020 20:08:57 +0530 Subject: [PATCH 06/62] updated js function, cleaned preview --- frappe/website/doctype/blog_post/blog_post.js | 61 +++++++++++++------ .../website/doctype/blog_post/blog_post.json | 3 +- 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/frappe/website/doctype/blog_post/blog_post.js b/frappe/website/doctype/blog_post/blog_post.js index 3668748b74..60dd7ee7cb 100644 --- a/frappe/website/doctype/blog_post/blog_post.js +++ b/frappe/website/doctype/blog_post/blog_post.js @@ -3,24 +3,47 @@ frappe.ui.form.on('Blog Post', { refresh: function(frm) { - frm.call('get_url').then((r)=>{ - let google_preview = frm.get_field("google_preview") - google_preview.html(` - - - ${ r.message + '/' + frm.doc.route } -

- ${ frm.doc.title }

- ${ frm.doc.published_on } ${frm.doc.meta_description} - `) - }) + generate_google_search_preview(frm) + }, + title: function(frm) { + generate_google_search_preview(frm) + }, + meta_description:function(frm){ + generate_google_search_preview(frm) + }, + description:function(frm){ + generate_google_search_preview(frm) } }); +function generate_google_search_preview(frm){ + frm.call('get_url').then((r)=>{ + let seo_title = frm.doc.title + seo_title = seo_title.slice(0,60) + let seo_description = frm.doc.meta_description || frm.doc.description + seo_description = seo_description.slice(0,160) + let google_preview = frm.get_field("google_preview") + google_preview.html(` + +
+
+ ${ r.message + '/' + frm.doc.route } + + +

+ ${ frm.doc.published_on }-${seo_description} +

+
+
+ `) + }); +} diff --git a/frappe/website/doctype/blog_post/blog_post.json b/frappe/website/doctype/blog_post/blog_post.json index d7f04e2442..f4f66c95ea 100644 --- a/frappe/website/doctype/blog_post/blog_post.json +++ b/frappe/website/doctype/blog_post/blog_post.json @@ -154,6 +154,7 @@ "fieldtype": "Section Break" }, { + "description": "This is an example Google SERP Preview.", "fieldname": "google_preview", "fieldtype": "HTML", "label": "Google Snippet Preview", @@ -166,7 +167,7 @@ "is_published_field": "published", "links": [], "max_attachments": 5, - "modified": "2020-04-22 12:27:40.724507", + "modified": "2020-04-22 20:07:37.324345", "modified_by": "Administrator", "module": "Website", "name": "Blog Post", From b66864b9b13631245c16cf3c803cc4cf57e2dff5 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Thu, 23 Apr 2020 18:31:53 +0530 Subject: [PATCH 07/62] fix: check message id communication while linking communications --- .../doctype/email_account/email_account.py | 47 ++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/frappe/email/doctype/email_account/email_account.py b/frappe/email/doctype/email_account/email_account.py index c0a198f5e5..88a0980bee 100755 --- a/frappe/email/doctype/email_account/email_account.py +++ b/frappe/email/doctype/email_account/email_account.py @@ -533,28 +533,33 @@ class EmailAccount(Document): parent = None in_reply_to = (email.mail.get("In-Reply-To") or "").strip(" <>") - if in_reply_to and "@{0}".format(frappe.local.site) in in_reply_to: - # reply to a communication sent from the system - email_queue = frappe.db.get_value('Email Queue', dict(message_id=in_reply_to), ['communication','reference_doctype', 'reference_name']) - if email_queue: - parent_communication, parent_doctype, parent_name = email_queue - if parent_communication: - communication.in_reply_to = parent_communication + if in_reply_to: + if "@{0}".format(frappe.local.site) in in_reply_to: + # reply to a communication sent from the system + email_queue = frappe.db.get_value('Email Queue', dict(message_id=in_reply_to), ['communication','reference_doctype', 'reference_name']) + if email_queue: + parent_communication, parent_doctype, parent_name = email_queue + if parent_communication: + communication.in_reply_to = parent_communication + else: + reference, domain = in_reply_to.split("@", 1) + parent_doctype, parent_name = 'Communication', reference + + if frappe.db.exists(parent_doctype, parent_name): + parent = frappe._dict(doctype=parent_doctype, name=parent_name) + + # set in_reply_to of current communication + if parent_doctype=='Communication': + # communication.in_reply_to = email_queue.communication + + if parent.reference_name: + # the true parent is the communication parent + parent = frappe.get_doc(parent.reference_doctype, + parent.reference_name) else: - reference, domain = in_reply_to.split("@", 1) - parent_doctype, parent_name = 'Communication', reference - - if frappe.db.exists(parent_doctype, parent_name): - parent = frappe._dict(doctype=parent_doctype, name=parent_name) - - # set in_reply_to of current communication - if parent_doctype=='Communication': - # communication.in_reply_to = email_queue.communication - - if parent.reference_name: - # the true parent is the communication parent - parent = frappe.get_doc(parent.reference_doctype, - parent.reference_name) + comm = frappe.db.get_value('Communication', dict(message_id=in_reply_to), ['reference_doctype', 'reference_name'], as_dict=1) + if comm: + parent = frappe._dict(doctype=comm.reference_doctype, name=comm.reference_name) return parent From a9be0758d4517d2b1b042ddfeefdc71ff75b979c Mon Sep 17 00:00:00 2001 From: Saurabh Date: Thu, 23 Apr 2020 18:46:15 +0530 Subject: [PATCH 08/62] feat: compare meesage-id only with the communications created between last 30 days --- frappe/email/doctype/email_account/email_account.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/frappe/email/doctype/email_account/email_account.py b/frappe/email/doctype/email_account/email_account.py index 88a0980bee..082b16c17a 100755 --- a/frappe/email/doctype/email_account/email_account.py +++ b/frappe/email/doctype/email_account/email_account.py @@ -10,7 +10,7 @@ import socket import time from frappe import _ from frappe.model.document import Document -from frappe.utils import validate_email_address, cint, get_datetime, DATE_FORMAT, strip, comma_or, sanitize_html +from frappe.utils import validate_email_address, cint, get_datetime, DATE_FORMAT, strip, comma_or, sanitize_html, add_days from frappe.utils.user import is_system_user from frappe.utils.jinja import render_template from frappe.email.smtp import SMTPServer @@ -557,7 +557,11 @@ class EmailAccount(Document): parent = frappe.get_doc(parent.reference_doctype, parent.reference_name) else: - comm = frappe.db.get_value('Communication', dict(message_id=in_reply_to), ['reference_doctype', 'reference_name'], as_dict=1) + comm = frappe.db.get_value('Communication', + dict( + message_id=in_reply_to, + creation=['>=', add_days(get_datetime(), -30)]), + ['reference_doctype', 'reference_name'], as_dict=1) if comm: parent = frappe._dict(doctype=comm.reference_doctype, name=comm.reference_name) From 6e50d8e79255302322716ff911a14dcf63db01fb Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Fri, 24 Apr 2020 15:15:34 +0530 Subject: [PATCH 09/62] fix: add form control html --- frappe/website/doctype/blog_post/blog_post.js | 71 +++++++++++-------- 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/frappe/website/doctype/blog_post/blog_post.js b/frappe/website/doctype/blog_post/blog_post.js index 60dd7ee7cb..12e1d8e80e 100644 --- a/frappe/website/doctype/blog_post/blog_post.js +++ b/frappe/website/doctype/blog_post/blog_post.js @@ -3,47 +3,56 @@ frappe.ui.form.on('Blog Post', { refresh: function(frm) { - generate_google_search_preview(frm) + generate_google_search_preview(frm); }, title: function(frm) { - generate_google_search_preview(frm) + generate_google_search_preview(frm); }, - meta_description:function(frm){ - generate_google_search_preview(frm) + meta_description: function(frm) { + generate_google_search_preview(frm); }, - description:function(frm){ - generate_google_search_preview(frm) + title: function(frm) { + generate_google_search_preview(frm); } }); function generate_google_search_preview(frm){ frm.call('get_url').then((r)=>{ - let seo_title = frm.doc.title - seo_title = seo_title.slice(0,60) - let seo_description = frm.doc.meta_description || frm.doc.description - seo_description = seo_description.slice(0,160) - let google_preview = frm.get_field("google_preview") + let google_preview = frm.get_field("google_preview"); + let seo_title = (frm.doc.title || "").slice(0, 60); + let seo_description = (frm.doc.meta_description || frm.doc.blog_intro || "").slice(0, 160); + google_preview.html(` - -
-
- ${ r.message + '/' + frm.doc.route } - -
-

- ${ seo_title }

+ + +
+
+
+ +
+
+
+
+ + ${ r.message + '/' + frm.doc.route } + +

+ + ${ seo_title } + +

+

+ ${ frm.doc.published_on } - ${ seo_description } +

+
+
+ +
-

- ${ frm.doc.published_on }-${seo_description} -

-
`) - }); + }); } From 2f6a2966b2f6433ce4925249b7058da499fb8d5f Mon Sep 17 00:00:00 2001 From: Kenneth Sequeira Date: Fri, 24 Apr 2020 16:20:24 +0530 Subject: [PATCH 10/62] fix refresh code, add description --- frappe/website/doctype/blog_post/blog_post.js | 6 +++--- frappe/website/doctype/blog_post/blog_post.py | 15 +++++---------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/frappe/website/doctype/blog_post/blog_post.js b/frappe/website/doctype/blog_post/blog_post.js index 12e1d8e80e..955ffcd113 100644 --- a/frappe/website/doctype/blog_post/blog_post.js +++ b/frappe/website/doctype/blog_post/blog_post.js @@ -11,14 +11,14 @@ frappe.ui.form.on('Blog Post', { meta_description: function(frm) { generate_google_search_preview(frm); }, - title: function(frm) { + blog_intro: function(frm) { generate_google_search_preview(frm); } }); function generate_google_search_preview(frm){ frm.call('get_url').then((r)=>{ let google_preview = frm.get_field("google_preview"); - let seo_title = (frm.doc.title || "").slice(0, 60); + let seo_title = (frm.doc.title).slice(0, 60); let seo_description = (frm.doc.meta_description || frm.doc.blog_intro || "").slice(0, 160); google_preview.html(` @@ -48,7 +48,7 @@ function generate_google_search_preview(frm){

diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py index f71f1d3d5b..e9785855f4 100644 --- a/frappe/website/doctype/blog_post/blog_post.py +++ b/frappe/website/doctype/blog_post/blog_post.py @@ -66,22 +66,17 @@ class BlogPost(WebsiteGenerator): context.content = get_html_content_based_on_type(self, 'content', self.content_type) - if self.meta_description: - context.description = self.meta_description - else: - context.description = self.blog_intro or strip_html_tags(context.content[:140]) - + #if meta description is not present, then blog intro or first 140 characters of the blog will be set as description + context.description["description"] = self.meta_description or self.blog_intro or strip_html_tags(context.content[:140]) + context.metatags = { "name": self.title, "description": context.description, } + #if meta image is not present, then first image inside the blog will be set as so image = find_first_image(context.content) - if self.meta_image: - context.metatags["image"] = self.meta_image - else: - context.metatags["image"] = image - + context.metatags["image"] = self.meta_image or image self.load_comments(context) From 9a40383ebf0bbdffb17a40d8fbd4bc26b95bdf4b Mon Sep 17 00:00:00 2001 From: Kenneth Sequeira Date: Fri, 24 Apr 2020 18:28:31 +0530 Subject: [PATCH 11/62] cleanups --- frappe/website/doctype/blog_post/blog_post.js | 3 ++- frappe/website/doctype/blog_post/blog_post.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/frappe/website/doctype/blog_post/blog_post.js b/frappe/website/doctype/blog_post/blog_post.js index 955ffcd113..5c5308a115 100644 --- a/frappe/website/doctype/blog_post/blog_post.js +++ b/frappe/website/doctype/blog_post/blog_post.js @@ -27,7 +27,7 @@ function generate_google_search_preview(frm){
- +
@@ -47,6 +47,7 @@ function generate_google_search_preview(frm){

+
diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py index e9785855f4..100b55a362 100644 --- a/frappe/website/doctype/blog_post/blog_post.py +++ b/frappe/website/doctype/blog_post/blog_post.py @@ -74,7 +74,7 @@ class BlogPost(WebsiteGenerator): "description": context.description, } - #if meta image is not present, then first image inside the blog will be set as so + #if meta image is not present, then first image inside the blog will be set as the meta image image = find_first_image(context.content) context.metatags["image"] = self.meta_image or image From a50f8318314f1a4810d483a5b55f2a0293227e67 Mon Sep 17 00:00:00 2001 From: Kenneth Sequeira Date: Fri, 24 Apr 2020 18:52:15 +0530 Subject: [PATCH 12/62] fix deadlock issue --- frappe/website/doctype/blog_post/blog_post.js | 2 +- frappe/website/doctype/blog_post/blog_post.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/website/doctype/blog_post/blog_post.js b/frappe/website/doctype/blog_post/blog_post.js index 5c5308a115..a5aacc06bd 100644 --- a/frappe/website/doctype/blog_post/blog_post.js +++ b/frappe/website/doctype/blog_post/blog_post.js @@ -16,7 +16,7 @@ frappe.ui.form.on('Blog Post', { } }); function generate_google_search_preview(frm){ - frm.call('get_url').then((r)=>{ + frm.call('get_site_url').then((r)=>{ let google_preview = frm.get_field("google_preview"); let seo_title = (frm.doc.title).slice(0, 60); let seo_description = (frm.doc.meta_description || frm.doc.blog_intro || "").slice(0, 160); diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py index 100b55a362..3e6ce3f1c8 100644 --- a/frappe/website/doctype/blog_post/blog_post.py +++ b/frappe/website/doctype/blog_post/blog_post.py @@ -97,7 +97,7 @@ class BlogPost(WebsiteGenerator): else: context.comment_text = _('{0} comments').format(len(context.comment_list)) - def get_url(self): + def get_site_url(self): return frappe.utils.get_url() def get_list_context(context=None): From dcdc0d0e90311169527392a8a4c5602aea73314e Mon Sep 17 00:00:00 2001 From: Kenneth Sequeira Date: Fri, 24 Apr 2020 19:46:40 +0530 Subject: [PATCH 13/62] improve description --- frappe/website/doctype/blog_post/blog_post.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/website/doctype/blog_post/blog_post.js b/frappe/website/doctype/blog_post/blog_post.js index a5aacc06bd..c40bf7cbe0 100644 --- a/frappe/website/doctype/blog_post/blog_post.js +++ b/frappe/website/doctype/blog_post/blog_post.js @@ -49,7 +49,7 @@ function generate_google_search_preview(frm){

From 51dfe2971b3b9a47cc6cdbad2ea58f3d8e170dab Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 27 Apr 2020 15:36:00 +0530 Subject: [PATCH 14/62] feat: rename section and added description to preview section --- frappe/website/doctype/blog_post/blog_post.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/frappe/website/doctype/blog_post/blog_post.json b/frappe/website/doctype/blog_post/blog_post.json index f4f66c95ea..18e00e7905 100644 --- a/frappe/website/doctype/blog_post/blog_post.json +++ b/frappe/website/doctype/blog_post/blog_post.json @@ -133,7 +133,7 @@ { "fieldname": "seo_section", "fieldtype": "Section Break", - "label": "SEO Section" + "label": "SEO" }, { "fieldname": "meta_description", @@ -150,11 +150,12 @@ "label": "Meta Image" }, { + "description": "This is a test preview based on the meta description generated for this blog. The description can be of any length but Google will truncate it to 155 - 160 characters. You can also check the previews for Facebook and Twitter using their debugger tools. ", "fieldname": "section_break_20", - "fieldtype": "Section Break" + "fieldtype": "Section Break", + "label": "Google Search Preview" }, { - "description": "This is an example Google SERP Preview.", "fieldname": "google_preview", "fieldtype": "HTML", "label": "Google Snippet Preview", @@ -167,7 +168,7 @@ "is_published_field": "published", "links": [], "max_attachments": 5, - "modified": "2020-04-22 20:07:37.324345", + "modified": "2020-04-27 15:12:02.179731", "modified_by": "Administrator", "module": "Website", "name": "Blog Post", From fd15d2608cfbdce7f867ce85f8191ca8246ca293 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 27 Apr 2020 15:36:14 +0530 Subject: [PATCH 15/62] refactor: clean html for preview --- frappe/website/doctype/blog_post/blog_post.js | 56 +++++++------------ 1 file changed, 19 insertions(+), 37 deletions(-) diff --git a/frappe/website/doctype/blog_post/blog_post.js b/frappe/website/doctype/blog_post/blog_post.js index c40bf7cbe0..dea86b3b27 100644 --- a/frappe/website/doctype/blog_post/blog_post.js +++ b/frappe/website/doctype/blog_post/blog_post.js @@ -16,44 +16,26 @@ frappe.ui.form.on('Blog Post', { } }); function generate_google_search_preview(frm){ - frm.call('get_site_url').then((r)=>{ - let google_preview = frm.get_field("google_preview"); - let seo_title = (frm.doc.title).slice(0, 60); - let seo_description = (frm.doc.meta_description || frm.doc.blog_intro || "").slice(0, 160); + let google_preview = frm.get_field("google_preview"); + let seo_title = (frm.doc.title).slice(0, 60); + let seo_description = (frm.doc.meta_description || frm.doc.blog_intro || "").slice(0, 160); + let date = frm.doc.published_on ? new frappe.datetime.datetime(frm.doc.published_on).moment.format('ll') + ' - ' : ''; + let route_array = frm.doc.route.split('/'); + route_array.pop(); - google_preview.html(` - - -
-
-
- -
-
-
-
- - ${ r.message + '/' + frm.doc.route } - -

- - ${ seo_title } - -

-

- ${ frm.doc.published_on } - ${ seo_description } -

-
-
-
- -
+ google_preview.html(` + +
+ + ${frappe.boot.sitename} + › ${route_array.join(' › ')} + +
+ ${ seo_title }
+

+ ${ date } ${ seo_description } +

- `) - }); + `); } From b8512b689d317bdadcc56e396ce7542b162d9b4b Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 27 Apr 2020 15:40:22 +0530 Subject: [PATCH 16/62] feat: clean up unused api and white spaces --- frappe/website/doctype/blog_post/blog_post.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py index 3e6ce3f1c8..ad57c8a667 100644 --- a/frappe/website/doctype/blog_post/blog_post.py +++ b/frappe/website/doctype/blog_post/blog_post.py @@ -37,7 +37,7 @@ class BlogPost(WebsiteGenerator): if self.published and not self.published_on: self.published_on = today() - + # update posts frappe.db.sql("""UPDATE `tabBlogger` SET `posts`=(SELECT COUNT(*) FROM `tabBlog Post` WHERE IFNULL(`blogger`,'')=`tabBlogger`.`name`) @@ -65,10 +65,10 @@ class BlogPost(WebsiteGenerator): context.content = get_html_content_based_on_type(self, 'content', self.content_type) - + #if meta description is not present, then blog intro or first 140 characters of the blog will be set as description context.description["description"] = self.meta_description or self.blog_intro or strip_html_tags(context.content[:140]) - + context.metatags = { "name": self.title, "description": context.description, @@ -76,7 +76,7 @@ class BlogPost(WebsiteGenerator): #if meta image is not present, then first image inside the blog will be set as the meta image image = find_first_image(context.content) - context.metatags["image"] = self.meta_image or image + context.metatags["image"] = self.meta_image or image self.load_comments(context) @@ -96,9 +96,6 @@ class BlogPost(WebsiteGenerator): context.comment_text = _('1 comment') else: context.comment_text = _('{0} comments').format(len(context.comment_list)) - - def get_site_url(self): - return frappe.utils.get_url() def get_list_context(context=None): list_context = frappe._dict( From 80a3288e72140cfba67d339d4038d77fffbf9e10 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 27 Apr 2020 15:54:21 +0530 Subject: [PATCH 17/62] fix: assignment error --- frappe/website/doctype/blog_post/blog_post.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py index ad57c8a667..27ca122302 100644 --- a/frappe/website/doctype/blog_post/blog_post.py +++ b/frappe/website/doctype/blog_post/blog_post.py @@ -67,7 +67,7 @@ class BlogPost(WebsiteGenerator): context.content = get_html_content_based_on_type(self, 'content', self.content_type) #if meta description is not present, then blog intro or first 140 characters of the blog will be set as description - context.description["description"] = self.meta_description or self.blog_intro or strip_html_tags(context.content[:140]) + context.description = self.meta_description or self.blog_intro or strip_html_tags(context.content[:140]) context.metatags = { "name": self.title, From f62ce81866aa072e7b030820a949c43290d26e99 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 27 Apr 2020 15:54:59 +0530 Subject: [PATCH 18/62] refactor: explicitly set None --- frappe/website/doctype/blog_post/blog_post.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py index 27ca122302..e2e24afbab 100644 --- a/frappe/website/doctype/blog_post/blog_post.py +++ b/frappe/website/doctype/blog_post/blog_post.py @@ -76,7 +76,7 @@ class BlogPost(WebsiteGenerator): #if meta image is not present, then first image inside the blog will be set as the meta image image = find_first_image(context.content) - context.metatags["image"] = self.meta_image or image + context.metatags["image"] = self.meta_image or image or None self.load_comments(context) From 88d5ef1bd7183d965cdd47a57ebc4b50fbfb2ddc Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 28 Apr 2020 10:40:24 +0530 Subject: [PATCH 19/62] fix: linitng fixes --- frappe/website/doctype/blog_post/blog_post.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/website/doctype/blog_post/blog_post.js b/frappe/website/doctype/blog_post/blog_post.js index dea86b3b27..adc03ca77e 100644 --- a/frappe/website/doctype/blog_post/blog_post.js +++ b/frappe/website/doctype/blog_post/blog_post.js @@ -15,7 +15,8 @@ frappe.ui.form.on('Blog Post', { generate_google_search_preview(frm); } }); -function generate_google_search_preview(frm){ + +function generate_google_search_preview(frm) { let google_preview = frm.get_field("google_preview"); let seo_title = (frm.doc.title).slice(0, 60); let seo_description = (frm.doc.meta_description || frm.doc.blog_intro || "").slice(0, 160); From 957aede112c1e5855d930bfca33ab8f9180a8690 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 28 Apr 2020 13:09:24 +0530 Subject: [PATCH 20/62] fix: validate options for Table and Table Multiselect --- frappe/core/doctype/doctype/doctype.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index d922cfe166..2d671476f6 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -903,6 +903,16 @@ def validate_fields(meta): frappe.msgprint(text_str + df_options_str, title="Invalid Data Field", raise_exception=True) + def check_child_table_option(docfield): + if not docfield.fieldtype in ['Table MultiSelect', 'Table']: return + + doctype = docfield.options + meta = frappe.get_meta(doctype) + + if not meta.istable: + frappe.throw(_('Option {0} for field {1} is not a child table') + .format(frappe.bold(doctype), frappe.bold(docfield.fieldname)), title=_("Invalid Option")) + fields = meta.get("fields") fieldname_list = [d.fieldname for d in fields] @@ -931,6 +941,7 @@ def validate_fields(meta): check_illegal_default(d) check_unique_and_text(meta.get("name"), d) check_illegal_depends_on_conditions(d) + check_child_table_option(d) check_table_multiselect_option(d) scrub_options_in_select(d) scrub_fetch_from(d) From d49941f2d1bf760d8fbb98b1aa64f151cf00809a Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 28 Apr 2020 20:25:23 +0530 Subject: [PATCH 21/62] style: membership check --- frappe/core/doctype/doctype/doctype.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index 2d671476f6..09a5e999b0 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -904,7 +904,7 @@ def validate_fields(meta): frappe.msgprint(text_str + df_options_str, title="Invalid Data Field", raise_exception=True) def check_child_table_option(docfield): - if not docfield.fieldtype in ['Table MultiSelect', 'Table']: return + if docfield.fieldtype not in ['Table MultiSelect', 'Table']: return doctype = docfield.options meta = frappe.get_meta(doctype) From 031aad0d8524db5725a0fe4d43cb73d29a949c4e Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Wed, 29 Apr 2020 12:28:08 +0530 Subject: [PATCH 22/62] perf: Cache get_tables values - To avoid redundant db calls --- frappe/database/database.py | 11 ++++++++++- frappe/database/schema.py | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/frappe/database/database.py b/frappe/database/database.py index b083ff1014..cc76745c2e 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -769,7 +769,16 @@ class Database(object): return ("tab" + doctype) in self.get_tables() def get_tables(self): - return [d[0] for d in self.sql("select table_name from information_schema.tables where table_schema not in ('pg_catalog', 'information_schema')")] + tables = frappe.cache().get_value('db_tables') + if not tables: + table_rows = self.sql(""" + SELECT table_name + FROM information_schema.tables + WHERE table_schema NOT IN ('pg_catalog', 'information_schema') + """) + tables = set([d[0] for d in table_rows]) + frappe.cache().set_value('db_tables', tables) + return tables def a_row_exists(self, doctype): """Returns True if atleast one row exists.""" diff --git a/frappe/database/schema.py b/frappe/database/schema.py index 28e055f382..3d484a1f1b 100644 --- a/frappe/database/schema.py +++ b/frappe/database/schema.py @@ -31,6 +31,7 @@ class DBTable: def sync(self): if self.is_new(): + frappe.cache().delete_key('db_tables') self.create() else: frappe.cache().hdel('table_columns', self.table_name) From 651109bb004fa9edd9a400358b1db7e6ffed3019 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Wed, 29 Apr 2020 14:07:51 +0530 Subject: [PATCH 23/62] fix: Translatable string --- frappe/database/schema.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/frappe/database/schema.py b/frappe/database/schema.py index 3d484a1f1b..9c7008a8ed 100644 --- a/frappe/database/schema.py +++ b/frappe/database/schema.py @@ -144,10 +144,9 @@ class DBTable: if max_length and max_length[0][0] and max_length[0][0] > new_length: if col.fieldname in self.columns: self.columns[col.fieldname].length = current_length - - frappe.msgprint(_("""Reverting length to {0} for '{1}' in '{2}'; - Setting the length as {3} will cause truncation of data.""") - .format(current_length, col.fieldname, self.doctype, new_length)) + info_message = _("Reverting length to {0} for '{1}' in '{2}'. Setting the length as {3} will cause truncation of data.") \ + .format(current_length, col.fieldname, self.doctype, new_length) + frappe.msgprint(info_message) def is_new(self): return self.table_name not in frappe.db.get_tables() From 7a6a9b2b207733dc77821b2e5d382fe28e89bc2a Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Wed, 29 Apr 2020 14:15:06 +0530 Subject: [PATCH 24/62] fix: Use standard button components in Hero --- frappe/website/web_template/hero/hero.html | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/frappe/website/web_template/hero/hero.html b/frappe/website/web_template/hero/hero.html index a3fb4aa466..e7b69ab782 100644 --- a/frappe/website/web_template/hero/hero.html +++ b/frappe/website/web_template/hero/hero.html @@ -9,22 +9,12 @@

{%- endif -%} {%- if primary_action or secondary_action -%} -
+
{%- if primary_action -%} - + {{ c('button', label=primary_action_label, url=primary_action, variant="primary", size="large") }} {%- endif -%} {%- if secondary_action -%} - + {{ c('button', label=secondary_action_label, url=secondary_action, variant="secondary", size="large", class="ml-4") }} {%- endif -%}
{%- endif -%} From 811d0d64d90986bf637b0c4608327e212766ddd7 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Wed, 29 Apr 2020 14:15:46 +0530 Subject: [PATCH 25/62] fix: Option to bleed image outside Hero --- .../hero_with_right_image.html | 16 ++++++++++++---- .../hero_with_right_image.json | 8 +++++++- .../website/website_theme/standard/standard.json | 2 +- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/frappe/website/web_template/hero_with_right_image/hero_with_right_image.html b/frappe/website/web_template/hero_with_right_image/hero_with_right_image.html index 57a1a02af7..11d49eb287 100644 --- a/frappe/website/web_template/hero_with_right_image/hero_with_right_image.html +++ b/frappe/website/web_template/hero_with_right_image/hero_with_right_image.html @@ -1,5 +1,5 @@
-
+

@@ -22,8 +22,16 @@

{%- if image -%} - + {{ c('image_with_blur', + class=["hidden md:block", "w-full md:w-6/12" if contain_image else "md:max-w-md lg:max-w-lg xl:max-w-xl xxl:max-w-2xl"], + src=image, + alt="") + }} {%- endif -%}
+ +{%- if not contain_image -%} + +{%- endif -%} diff --git a/frappe/website/web_template/hero_with_right_image/hero_with_right_image.json b/frappe/website/web_template/hero_with_right_image/hero_with_right_image.json index bb841a3156..3cb4701e7c 100644 --- a/frappe/website/web_template/hero_with_right_image/hero_with_right_image.json +++ b/frappe/website/web_template/hero_with_right_image/hero_with_right_image.json @@ -21,6 +21,12 @@ "label": "Image", "reqd": 0 }, + { + "fieldname": "contain_image", + "fieldtype": "Check", + "label": "Restrict Image inside Container", + "reqd": 0 + }, { "fieldname": "primary_action_label", "fieldtype": "Data", @@ -47,7 +53,7 @@ } ], "idx": 0, - "modified": "2020-04-26 15:08:26.937576", + "modified": "2020-04-29 14:12:31.613545", "modified_by": "Administrator", "name": "Hero with Right Image", "owner": "Administrator", diff --git a/frappe/website/website_theme/standard/standard.json b/frappe/website/website_theme/standard/standard.json index ca9e81bf27..1729e4616a 100644 --- a/frappe/website/website_theme/standard/standard.json +++ b/frappe/website/website_theme/standard/standard.json @@ -10,7 +10,7 @@ "font_properties": "300,600", "footer": [], "idx": 26, - "modified": "2020-04-24 23:52:27.211811", + "modified": "2020-04-29 12:26:48.399125", "modified_by": "Administrator", "module": "Website", "name": "Standard", From bf3a80f05de7fc9dbcf41d2199d71c832cbc5148 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Wed, 29 Apr 2020 14:39:14 +0530 Subject: [PATCH 26/62] fix: Directly used set comprehension As indicated by deepsource --- frappe/database/database.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/database/database.py b/frappe/database/database.py index cc76745c2e..103538944c 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -776,7 +776,7 @@ class Database(object): FROM information_schema.tables WHERE table_schema NOT IN ('pg_catalog', 'information_schema') """) - tables = set([d[0] for d in table_rows]) + tables = set(d[0] for d in table_rows) frappe.cache().set_value('db_tables', tables) return tables From a73be732fd55d1ba8a2952ab9043530a8ef2ad75 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Wed, 29 Apr 2020 16:43:01 +0530 Subject: [PATCH 27/62] refactor: Fix redundant cache value set --- frappe/database/database.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/database/database.py b/frappe/database/database.py index 103538944c..3092e6c0ae 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -777,7 +777,7 @@ class Database(object): WHERE table_schema NOT IN ('pg_catalog', 'information_schema') """) tables = set(d[0] for d in table_rows) - frappe.cache().set_value('db_tables', tables) + frappe.cache().set_value('db_tables', tables) return tables def a_row_exists(self, doctype): From 109d2e7f12c4b8786d21abd09beac2987e1027f9 Mon Sep 17 00:00:00 2001 From: Kenneth Sequeira Date: Wed, 29 Apr 2020 17:33:20 +0530 Subject: [PATCH 28/62] rename seo section to meta tags --- .../website/doctype/blog_post/blog_post.json | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/frappe/website/doctype/blog_post/blog_post.json b/frappe/website/doctype/blog_post/blog_post.json index 18e00e7905..04e349a2b0 100644 --- a/frappe/website/doctype/blog_post/blog_post.json +++ b/frappe/website/doctype/blog_post/blog_post.json @@ -22,7 +22,7 @@ "content_md", "content_html", "email_sent", - "seo_section", + "meta_tags", "meta_description", "column_break_18", "meta_image", @@ -130,11 +130,6 @@ "fieldtype": "Check", "label": "Disable Comments" }, - { - "fieldname": "seo_section", - "fieldtype": "Section Break", - "label": "SEO" - }, { "fieldname": "meta_description", "fieldtype": "Small Text", @@ -150,16 +145,20 @@ "label": "Meta Image" }, { - "description": "This is a test preview based on the meta description generated for this blog. The description can be of any length but Google will truncate it to 155 - 160 characters. You can also check the previews for Facebook and Twitter using their debugger tools. ", "fieldname": "section_break_20", - "fieldtype": "Section Break", - "label": "Google Search Preview" + "fieldtype": "Section Break" }, { + "description": "This is an example Google SERP Preview.", "fieldname": "google_preview", "fieldtype": "HTML", "label": "Google Snippet Preview", "read_only": 1 + }, + { + "fieldname": "meta_tags", + "fieldtype": "Section Break", + "label": "Meta Tags" } ], "has_web_view": 1, @@ -168,7 +167,7 @@ "is_published_field": "published", "links": [], "max_attachments": 5, - "modified": "2020-04-27 15:12:02.179731", + "modified": "2020-04-29 17:32:41.055883", "modified_by": "Administrator", "module": "Website", "name": "Blog Post", From 74f0f3019b631236ab602a5944e9fab04962d338 Mon Sep 17 00:00:00 2001 From: prssanna Date: Wed, 29 Apr 2020 19:24:26 +0530 Subject: [PATCH 29/62] fix: make arrow on select box clickable --- frappe/public/less/controls.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/less/controls.less b/frappe/public/less/controls.less index d88e6adaec..564c77c07f 100644 --- a/frappe/public/less/controls.less +++ b/frappe/public/less/controls.less @@ -162,6 +162,6 @@ top: 8px; height: 15px; right: 12px; - top: 8px; + pointer-events: none; } } From ee3d0ee2a4901db8d63c830fe0f3f2270fc4bf7f Mon Sep 17 00:00:00 2001 From: prssanna Date: Wed, 29 Apr 2020 19:58:20 +0530 Subject: [PATCH 30/62] fix: fix error for child table in_list_view check --- frappe/core/doctype/doctype/doctype.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index 0509ea9af7..31beabc56a 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -712,9 +712,10 @@ def validate_fields(meta): if d.fieldtype == "Currency" and cint(d.width) < 100: frappe.throw(_("Max width for type Currency is 100px in row {0}").format(d.idx)) - def check_in_list_view(d): + def check_in_list_view(is_table, d): if d.in_list_view and (d.fieldtype in not_allowed_in_list_view): - frappe.throw(_("'In List View' not allowed for type {0} in row {1}").format(d.fieldtype, d.idx)) + property_label = 'In Grid View' if is_table else 'In List View' + frappe.throw(_("'{0}' not allowed for type {1} in row {2}").format(property_label, d.fieldtype, d.idx)) def check_in_global_search(d): if d.in_global_search and d.fieldtype in no_value_fields: @@ -929,7 +930,7 @@ def validate_fields(meta): check_link_table_options(meta.get("name"), d) check_dynamic_link_options(d) check_hidden_and_mandatory(meta.get("name"), d) - check_in_list_view(d) + check_in_list_view(meta.get('istable'), d) check_in_global_search(d) check_illegal_default(d) check_unique_and_text(meta.get("name"), d) From 2f821f9c2d27834142e1f89bbedbee9874c355c2 Mon Sep 17 00:00:00 2001 From: "Chinmay D. Pai" Date: Wed, 29 Apr 2020 21:58:00 +0530 Subject: [PATCH 31/62] chore: fix deepsource issues * use set comprehension instead of generator * remove redundant else statement Signed-off-by: Chinmay D. Pai --- frappe/database/database.py | 2 +- frappe/database/schema.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/frappe/database/database.py b/frappe/database/database.py index 3092e6c0ae..364f0c73cd 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -776,7 +776,7 @@ class Database(object): FROM information_schema.tables WHERE table_schema NOT IN ('pg_catalog', 'information_schema') """) - tables = set(d[0] for d in table_rows) + tables = {d[0] for d in table_rows} frappe.cache().set_value('db_tables', tables) return tables diff --git a/frappe/database/schema.py b/frappe/database/schema.py index 9c7008a8ed..83c22090eb 100644 --- a/frappe/database/schema.py +++ b/frappe/database/schema.py @@ -138,8 +138,7 @@ class DBTable: if frappe.db.is_missing_column(e): # Unknown column 'column_name' in 'field list' continue - else: - raise + raise if max_length and max_length[0][0] and max_length[0][0] > new_length: if col.fieldname in self.columns: From 551722c7254b77ccb391552168ecac871f587b34 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Wed, 29 Apr 2020 23:01:16 +0530 Subject: [PATCH 32/62] fix: Ability to hide blocks --- frappe/templates/components/web_block.html | 2 ++ .../doctype/web_page_block/web_page_block.json | 13 ++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/frappe/templates/components/web_block.html b/frappe/templates/components/web_block.html index d898417970..f0ed8f2df4 100644 --- a/frappe/templates/components/web_block.html +++ b/frappe/templates/components/web_block.html @@ -7,6 +7,7 @@ web_block.css_class ]) -%} +{%- if not web_block.hide_block -%} <{{htmltag}} class="{{ classes }}" data-section-idx="{{ web_block.idx | e }}" data-section-template="{{ web_block.web_template | e }}"> {%- if web_block.add_container -%} @@ -17,3 +18,4 @@
{%- endif -%} +{%- endif -%} diff --git a/frappe/website/doctype/web_page_block/web_page_block.json b/frappe/website/doctype/web_page_block/web_page_block.json index b415567bd0..77f2e25469 100644 --- a/frappe/website/doctype/web_page_block/web_page_block.json +++ b/frappe/website/doctype/web_page_block/web_page_block.json @@ -12,7 +12,8 @@ "column_break_5", "add_container", "add_padding", - "add_shade" + "add_shade", + "hide_block" ], "fields": [ { @@ -54,18 +55,24 @@ "default": "0", "fieldname": "add_shade", "fieldtype": "Check", - "label": "Shaded Section" + "label": "Add Gray Background" }, { "default": "1", "fieldname": "add_container", "fieldtype": "Check", "label": "Add Container" + }, + { + "default": "0", + "fieldname": "hide_block", + "fieldtype": "Check", + "label": "Hide Block" } ], "istable": 1, "links": [], - "modified": "2020-04-19 16:16:44.524042", + "modified": "2020-04-29 15:08:25.976179", "modified_by": "Administrator", "module": "Website", "name": "Web Page Block", From 4620074db49d94db938f1b1bf0549a7abe9d3b2d Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Wed, 29 Apr 2020 23:02:22 +0530 Subject: [PATCH 33/62] fix: Add Section Break for Cards Section template --- .../web_template_field.json | 4 +- .../section_with_cards.json | 98 ++++++++++++++----- 2 files changed, 75 insertions(+), 27 deletions(-) diff --git a/frappe/website/doctype/web_template_field/web_template_field.json b/frappe/website/doctype/web_template_field/web_template_field.json index 09335adf3a..900655e207 100644 --- a/frappe/website/doctype/web_template_field/web_template_field.json +++ b/frappe/website/doctype/web_template_field/web_template_field.json @@ -31,7 +31,7 @@ "fieldtype": "Select", "in_list_view": 1, "label": "Fieldtype", - "options": "Attach Image\nCheck\nData\nInt\nSelect\nSmall Text\nText\nMarkdown Editor", + "options": "Attach Image\nCheck\nData\nInt\nSelect\nSmall Text\nText\nMarkdown Editor\nSection Break\nColumn Break", "reqd": 1 }, { @@ -48,7 +48,7 @@ ], "istable": 1, "links": [], - "modified": "2020-04-24 17:05:25.322767", + "modified": "2020-04-29 14:53:23.192395", "modified_by": "Administrator", "module": "Website", "name": "Web Template Field", diff --git a/frappe/website/web_template/section_with_cards/section_with_cards.json b/frappe/website/web_template/section_with_cards/section_with_cards.json index 89426651ad..9ec430ae60 100644 --- a/frappe/website/web_template/section_with_cards/section_with_cards.json +++ b/frappe/website/web_template/section_with_cards/section_with_cards.json @@ -22,153 +22,201 @@ "options": "Small\nMedium\nLarge", "reqd": 0 }, + { + "fieldname": "card_1", + "fieldtype": "Section Break", + "label": "Card 1", + "reqd": 0 + }, { "fieldname": "card_1_title", "fieldtype": "Data", - "label": "Card 1 Title", + "label": "Title", "reqd": 0 }, { "fieldname": "card_1_content", "fieldtype": "Small Text", - "label": "Card 1 Content", + "label": "Content", "reqd": 0 }, { "fieldname": "card_1_url", "fieldtype": "Data", - "label": "Card 1 URL", + "label": "URL", + "reqd": 0 + }, + { + "fieldname": "card_2", + "fieldtype": "Section Break", + "label": "Card 2", "reqd": 0 }, { "fieldname": "card_2_title", "fieldtype": "Data", - "label": "Card 2 Title", + "label": "Title", "reqd": 0 }, { "fieldname": "card_2_content", "fieldtype": "Small Text", - "label": "Card 2 Content", + "label": "Content", "reqd": 0 }, { "fieldname": "card_2_url", "fieldtype": "Data", - "label": "Card 2 URL", + "label": "URL", + "reqd": 0 + }, + { + "fieldname": "card_3", + "fieldtype": "Section Break", + "label": "Card 3", "reqd": 0 }, { "fieldname": "card_3_title", "fieldtype": "Data", - "label": "Card 3 Title", + "label": "Title", "reqd": 0 }, { "fieldname": "card_3_content", "fieldtype": "Small Text", - "label": "Card 3 Content", + "label": "Content", "reqd": 0 }, { "fieldname": "card_3_url", "fieldtype": "Data", - "label": "Card 3 URL", + "label": "URL", + "reqd": 0 + }, + { + "fieldname": "card_4", + "fieldtype": "Section Break", + "label": "Card 4", "reqd": 0 }, { "fieldname": "card_4_title", "fieldtype": "Data", - "label": "Card 4 Title", + "label": "Title", "reqd": 0 }, { "fieldname": "card_4_content", "fieldtype": "Small Text", - "label": "Card 4 Content", + "label": "Content", "reqd": 0 }, { "fieldname": "card_4_url", "fieldtype": "Data", - "label": "Card 4 URL", + "label": "URL", + "reqd": 0 + }, + { + "fieldname": "card_5", + "fieldtype": "Section Break", + "label": "Card 5", "reqd": 0 }, { "fieldname": "card_5_title", "fieldtype": "Data", - "label": "Card 5 Title", + "label": "Title", "reqd": 0 }, { "fieldname": "card_5_content", "fieldtype": "Small Text", - "label": "Card 5 Content", + "label": "Content", "reqd": 0 }, { "fieldname": "card_5_url", "fieldtype": "Data", - "label": "Card 5 URL", + "label": "URL", + "reqd": 0 + }, + { + "fieldname": "card_6", + "fieldtype": "Section Break", + "label": "Card 6", "reqd": 0 }, { "fieldname": "card_6_title", "fieldtype": "Data", - "label": "Card 6 Title", + "label": "Title", "reqd": 0 }, { "fieldname": "card_6_content", "fieldtype": "Small Text", - "label": "Card 6 Content", + "label": "Content", "reqd": 0 }, { "fieldname": "card_6_url", "fieldtype": "Data", - "label": "Card 6 URL", + "label": "URL", + "reqd": 0 + }, + { + "fieldname": "card_7", + "fieldtype": "Section Break", + "label": "Card 7", "reqd": 0 }, { "fieldname": "card_7_title", "fieldtype": "Data", - "label": "Card 7 Title", + "label": "Title", "reqd": 0 }, { "fieldname": "card_7_content", "fieldtype": "Small Text", - "label": "Card 7 Content", + "label": "Content", "reqd": 0 }, { "fieldname": "card_7_url", "fieldtype": "Data", - "label": "Card 7 URL", + "label": "URL", + "reqd": 0 + }, + { + "fieldname": "card_8", + "fieldtype": "Section Break", + "label": "Card 8", "reqd": 0 }, { "fieldname": "card_8_title", "fieldtype": "Data", - "label": "Card 8 Title", + "label": "Title", "reqd": 0 }, { "fieldname": "card_8_content", "fieldtype": "Small Text", - "label": "Card 8 Content", + "label": "Content", "reqd": 0 }, { "fieldname": "card_8_url", "fieldtype": "Data", - "label": "Card 8 URL", + "label": "URL", "reqd": 0 } ], "idx": 0, - "modified": "2020-04-21 21:24:04.192839", + "modified": "2020-04-29 22:40:03.362229", "modified_by": "Administrator", "name": "Section with Cards", "owner": "Administrator", From 2bbe26ada024824faeadefb5d85cff774eef4376 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Wed, 29 Apr 2020 23:02:43 +0530 Subject: [PATCH 34/62] fix: Max height for hero image --- .../hero_with_right_image/hero_with_right_image.html | 2 +- tailwind.config.js | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/frappe/website/web_template/hero_with_right_image/hero_with_right_image.html b/frappe/website/web_template/hero_with_right_image/hero_with_right_image.html index 11d49eb287..8efc46a1b7 100644 --- a/frappe/website/web_template/hero_with_right_image/hero_with_right_image.html +++ b/frappe/website/web_template/hero_with_right_image/hero_with_right_image.html @@ -23,7 +23,7 @@
{%- if image -%} {{ c('image_with_blur', - class=["hidden md:block", "w-full md:w-6/12" if contain_image else "md:max-w-md lg:max-w-lg xl:max-w-xl xxl:max-w-2xl"], + class=["hidden md:block max-h-144", "w-full md:w-6/12" if contain_image else "md:max-w-md lg:max-w-lg xl:max-w-xl xxl:max-w-2xl"], src=image, alt="") }} diff --git a/tailwind.config.js b/tailwind.config.js index e75ff16e85..03678ee166 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -46,6 +46,9 @@ module.exports = { borderRadius: { xl: '0.75rem' }, + maxHeight: { + '144': '36rem' + }, boxShadow: theme => ({ 'outline-primary': `0 0 0 3px ${rgba(theme('colors.blue.300'), 0.45)}` }), From 2788cf3d196cbf67bcfdc4ae182f2d2181c108bd Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Wed, 29 Apr 2020 23:03:46 +0530 Subject: [PATCH 35/62] fix: Clickable navbar button in firefox --- .../navbar_with_links_on_right.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/website/web_template/navbar_with_links_on_right/navbar_with_links_on_right.html b/frappe/website/web_template/navbar_with_links_on_right/navbar_with_links_on_right.html index ffa8be24da..01652f8c80 100644 --- a/frappe/website/web_template/navbar_with_links_on_right/navbar_with_links_on_right.html +++ b/frappe/website/web_template/navbar_with_links_on_right/navbar_with_links_on_right.html @@ -6,8 +6,8 @@
- -