From a5fc3d82ddd58844b5ea4ca4bd50c0c490c60b3a Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 30 Mar 2020 11:58:55 +0530 Subject: [PATCH 1/2] fix: Get valid columns from meta only if table exists (for doctype action) --- frappe/model/meta.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frappe/model/meta.py b/frappe/model/meta.py index 5065684311..84c96d0566 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -68,7 +68,7 @@ def load_doctype_from_file(doctype): class Meta(Document): _metaclass = True default_fields = list(default_fields)[1:] - special_doctypes = ("DocField", "DocPerm", "Role", "DocType", "Module Def") + special_doctypes = ("DocField", "DocPerm", "Role", "DocType", "Module Def", 'DocType Action', 'DocType Link') def __init__(self, doctype): self._fields = {} @@ -165,7 +165,8 @@ class Meta(Document): def get_valid_columns(self): if not hasattr(self, "_valid_columns"): - if self.name in ("DocType", "DocField", "DocPerm", 'DocType Action', 'DocType Link'): + table_exists = frappe.db.table_exists(self.name) + if self.name in self.special_doctypes and table_exists: self._valid_columns = get_table_columns(self.name) else: self._valid_columns = self.default_fields + \ From 737ecae59d3811ac870ac18bf09564b65c8c60af Mon Sep 17 00:00:00 2001 From: prafful1234 <43948551+prafful1234@users.noreply.github.com> Date: Mon, 30 Mar 2020 12:53:21 +0530 Subject: [PATCH 2/2] feat(website): fetch email comments in issue portal (#9657) * feat(website): fetch email comments in issue portal * fix: deepsource issues Signed-off-by: Chinmay D. Pai * chore: remove unnecessary import not sure how i missed it Signed-off-by: Chinmay D. Pai Co-authored-by: prafful1234 Co-authored-by: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Co-authored-by: Chinmay D. Pai --- frappe/desk/form/utils.py | 16 ++++--- .../public/js/frappe/form/footer/timeline.js | 3 +- frappe/website/utils.py | 47 ++++++++++++++----- 3 files changed, 45 insertions(+), 21 deletions(-) diff --git a/frappe/desk/form/utils.py b/frappe/desk/form/utils.py index 498ab50645..4c3bab2e23 100644 --- a/frappe/desk/form/utils.py +++ b/frappe/desk/form/utils.py @@ -56,18 +56,20 @@ def validate_link(): frappe.response['valid_value'] = valid_value frappe.response['message'] = 'Ok' + @frappe.whitelist() -def add_comment(reference_doctype, reference_name, content, comment_email): +def add_comment(reference_doctype, reference_name, content, comment_email, comment_by): """allow any logged user to post a comment""" doc = frappe.get_doc(dict( - doctype = 'Comment', - reference_doctype = reference_doctype, - reference_name = reference_name, - comment_email = comment_email, - comment_type = 'Comment' + doctype='Comment', + reference_doctype=reference_doctype, + reference_name=reference_name, + comment_email=comment_email, + comment_type='Comment', + comment_by=comment_by )) doc.content = extract_images_from_html(doc, content) - doc.insert(ignore_permissions = True) + doc.insert(ignore_permissions=True) follow_document(doc.reference_doctype, doc.reference_name, frappe.session.user) return doc.as_dict() diff --git a/frappe/public/js/frappe/form/footer/timeline.js b/frappe/public/js/frappe/form/footer/timeline.js index 593f987a9a..d27c65548d 100644 --- a/frappe/public/js/frappe/form/footer/timeline.js +++ b/frappe/public/js/frappe/form/footer/timeline.js @@ -703,7 +703,8 @@ frappe.ui.form.Timeline = class Timeline { reference_doctype: this.frm.doctype, reference_name: this.frm.docname, content: comment, - comment_email: frappe.session.user + comment_email: frappe.session.user, + comment_by: frappe.session.user_fullname }, btn: btn, callback: function(r) { diff --git a/frappe/website/utils.py b/frappe/website/utils.py index 495c36c92a..f5e35976eb 100644 --- a/frappe/website/utils.py +++ b/frappe/website/utils.py @@ -3,11 +3,15 @@ from __future__ import unicode_literals import functools -import frappe, re, os +import re +import os +import frappe + from six import iteritems from past.builtins import cmp from frappe.utils import markdown + def delete_page_cache(path): cache = frappe.cache() cache.delete_value('full_index') @@ -20,7 +24,7 @@ def delete_page_cache(path): cache.delete_key(name) def find_first_image(html): - m = re.finditer("""]*src\s?=\s?['"]([^'"]*)['"]""", html) + m = re.finditer(r"""]*src\s?=\s?['"]([^'"]*)['"]""", html) try: return next(m).groups()[0] except StopIteration: @@ -33,16 +37,34 @@ def can_cache(no_cache=False): return False return not no_cache + def get_comment_list(doctype, name): - return frappe.get_all('Comment', - fields = ['name', 'creation', 'owner', 'comment_email', 'comment_by', 'content'], - filters = dict( - reference_doctype = doctype, - reference_name = name, - comment_type = 'Comment', - published = 1 - ), - order_by = 'creation asc') + comments = frappe.get_all('Comment', + fields=['name', 'creation', 'owner', + 'comment_email', 'comment_by', 'content'], + filters=dict( + reference_doctype=doctype, + reference_name=name, + comment_type='Comment', + ), + or_filters=[ + ['owner', '=', frappe.session.user], + ['published', '=', 1]]) + + communications = frappe.get_all("Communication", + fields=['name', 'creation', 'owner', 'owner as comment_email', + 'sender_full_name as comment_by', 'content', 'recipients'], + filters=dict( + reference_doctype=doctype, + reference_name=name, + ), + or_filters=[ + ['recipients', 'like', '%{0}%'.format(frappe.session.user)], + ['cc', 'like', '%{0}%'.format(frappe.session.user)], + ['bcc', 'like', '%{0}%'.format(frappe.session.user)]]) + + return sorted((comments + communications), key=lambda comment: comment['creation'], reverse=True) + def get_home_page(): if frappe.local.flags.home_page: @@ -92,7 +114,7 @@ def cleanup_page_name(title): return '' name = title.lower() - name = re.sub('[~!@#$%^&*+()<>,."\'\?]', '', name) + name = re.sub(r'[~!@#$%^&*+()<>,."\'\?]', '', name) name = re.sub('[:/]', '-', name) name = '-'.join(name.split()) @@ -194,7 +216,6 @@ def abs_url(path): def get_toc(route, url_prefix=None, app=None): '''Insert full index (table of contents) for {index} tag''' - from frappe.website.utils import get_full_index full_index = get_full_index(app=app)