From 8627cce88e13d34a85a444d0abf4d091ca9cfb07 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 19 Feb 2020 12:36:25 +0530 Subject: [PATCH 1/9] feat: added in_setup_wizard flag --- .../doctype/assignment_rule/assignment_rule.py | 2 +- .../milestone_tracker/milestone_tracker.py | 4 ++++ frappe/cache_manager.py | 18 +++++++++++++++--- frappe/desk/page/setup_wizard/setup_wizard.py | 3 +++ frappe/model/document.py | 2 +- .../energy_point_rule/energy_point_rule.py | 3 ++- 6 files changed, 26 insertions(+), 6 deletions(-) diff --git a/frappe/automation/doctype/assignment_rule/assignment_rule.py b/frappe/automation/doctype/assignment_rule/assignment_rule.py index 5d8dab90ce..0a5d85636f 100644 --- a/frappe/automation/doctype/assignment_rule/assignment_rule.py +++ b/frappe/automation/doctype/assignment_rule/assignment_rule.py @@ -165,7 +165,7 @@ def reopen_closed_assignment(doc): return True def apply(doc, method=None, doctype=None, name=None): - if frappe.flags.in_patch or frappe.flags.in_install: + if frappe.flags.in_patch or frappe.flags.in_install or frappe.flags.in_setup_wizard: return if not doc and doctype and name: diff --git a/frappe/automation/doctype/milestone_tracker/milestone_tracker.py b/frappe/automation/doctype/milestone_tracker/milestone_tracker.py index baa1bcc075..154cb599e1 100644 --- a/frappe/automation/doctype/milestone_tracker/milestone_tracker.py +++ b/frappe/automation/doctype/milestone_tracker/milestone_tracker.py @@ -30,6 +30,10 @@ class MilestoneTracker(Document): )).insert(ignore_permissions=True) def evaluate_milestone(doc, event): + if (frappe.flags.in_install + or frappe.flags.in_migrate + or frappe.flags.in_setup_wizard): + return for d in frappe.cache_manager.get_doctype_map('Milestone Tracker', doc.doctype, dict(document_type = doc.doctype, disabled=0)): frappe.get_doc('Milestone Tracker', d.name).apply(doc) diff --git a/frappe/cache_manager.py b/frappe/cache_manager.py index 1faa02ec63..2578d652b4 100644 --- a/frappe/cache_manager.py +++ b/frappe/cache_manager.py @@ -117,7 +117,11 @@ def clear_doctype_map(doctype, name): frappe.cache().hdel(cache_key, name) def build_table_count_cache(*args, **kwargs): - if frappe.flags.in_patch or frappe.flags.in_install or frappe.flags.in_import: + if (frappe.flags.in_patch + or frappe.flags.in_install + or frappe.flags.in_migrate + or frappe.flags.in_import + or frappe.flags.in_setup_wizard): return _cache = frappe.cache() data = frappe.db.multisql({ @@ -138,7 +142,11 @@ def build_table_count_cache(*args, **kwargs): return counts def build_domain_restriced_doctype_cache(*args, **kwargs): - if frappe.flags.in_patch or frappe.flags.in_install or frappe.flags.in_import: + if (frappe.flags.in_patch + or frappe.flags.in_install + or frappe.flags.in_migrate + or frappe.flags.in_import + or frappe.flags.in_setup_wizard): return _cache = frappe.cache() active_domains = frappe.get_active_domains() @@ -149,7 +157,11 @@ def build_domain_restriced_doctype_cache(*args, **kwargs): return doctypes def build_domain_restriced_page_cache(*args, **kwargs): - if frappe.flags.in_patch or frappe.flags.in_install or frappe.flags.in_import: + if (frappe.flags.in_patch + or frappe.flags.in_install + or frappe.flags.in_migrate + or frappe.flags.in_import + or frappe.flags.in_setup_wizard): return _cache = frappe.cache() active_domains = frappe.get_active_domains() diff --git a/frappe/desk/page/setup_wizard/setup_wizard.py b/frappe/desk/page/setup_wizard/setup_wizard.py index 43d4e8dde4..a8b4b4f280 100755 --- a/frappe/desk/page/setup_wizard/setup_wizard.py +++ b/frappe/desk/page/setup_wizard/setup_wizard.py @@ -61,6 +61,7 @@ def setup_complete(args): stages = get_setup_stages(args) try: + frappe.flags.in_setup_wizard = True current_task = None for idx, stage in enumerate(stages): frappe.publish_realtime('setup_task', {"progress": [idx, len(stages)], @@ -75,6 +76,8 @@ def setup_complete(args): else: run_setup_success(args) return {'status': 'ok'} + finally: + frappe.flags.in_setup_wizard = False def update_global_settings(args): if args.language and args.language != "English": diff --git a/frappe/model/document.py b/frappe/model/document.py index 80f18c74c4..e147bc42b0 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -268,7 +268,7 @@ class Document(BaseDocument): if hasattr(self, "__islocal"): delattr(self, "__islocal") - if not (frappe.flags.in_migrate or frappe.local.flags.in_install): + if not (frappe.flags.in_migrate or frappe.local.flags.in_install or frappe.flags.in_setup_wizard): follow_document(self.doctype, self.name, frappe.session.user) return self diff --git a/frappe/social/doctype/energy_point_rule/energy_point_rule.py b/frappe/social/doctype/energy_point_rule/energy_point_rule.py index 6615c2ab1d..b603cb2b24 100644 --- a/frappe/social/doctype/energy_point_rule/energy_point_rule.py +++ b/frappe/social/doctype/energy_point_rule/energy_point_rule.py @@ -84,7 +84,8 @@ def process_energy_points(doc, state): if (frappe.flags.in_patch or frappe.flags.in_install or frappe.flags.in_migrate - or frappe.flags.in_import): + or frappe.flags.in_import + or frappe.flags.in_setup_wizard): return if not is_energy_point_enabled(): From 07b0886272922d0d4d4a9729338e80a2b5687bd1 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 19 Feb 2020 12:36:37 +0530 Subject: [PATCH 2/9] feat: rebuild table count cache on trash --- frappe/hooks.py | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/hooks.py b/frappe/hooks.py index a132eb69d5..6389985086 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -140,6 +140,7 @@ doc_events = { "frappe.social.doctype.energy_point_rule.energy_point_rule.process_energy_points" ], "after_insert": "frappe.cache_manager.build_table_count_cache", + "on_trash": "frappe.cache_manager.build_table_count_cache", }, "Event": { "after_insert": "frappe.integrations.doctype.google_calendar.google_calendar.insert_event_in_google_calendar", From 9e68e0285f7835635aacf483a0192e9152290f9e Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 19 Feb 2020 12:34:07 +0530 Subject: [PATCH 3/9] feat: added timing decorator --- frappe/__init__.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/frappe/__init__.py b/frappe/__init__.py index 12e5204001..e6b4000524 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -10,6 +10,8 @@ from six import iteritems, binary_type, text_type, string_types, PY2 from werkzeug.local import Local, release_local import os, sys, importlib, inspect, json from past.builtins import cmp +from functools import wraps +from time import time from faker import Faker @@ -512,6 +514,18 @@ def whitelist(allow_guest=False, xss_safe=False): return innerfn +def timing(f): + + @wraps(f) + def wrap(*args, **kw): + ts = time() + result = f(*args, **kw) + te = time() + print('TIMING: {0} > {1} took: {2:2.4f} sec'.format(f.__module__, f.__name__, te-ts)) + return result + + return wrap + def read_only(): def innfn(fn): def wrapper_fn(*args, **kwargs): From 3f056e4c6e7675dc398e6cf3ea82e3ed40bf6f06 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 19 Feb 2020 13:08:15 +0530 Subject: [PATCH 4/9] feat: enabled logging for setup wizard --- frappe/desk/page/setup_wizard/setup_wizard.py | 5 +++++ frappe/hooks.py | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/frappe/desk/page/setup_wizard/setup_wizard.py b/frappe/desk/page/setup_wizard/setup_wizard.py index a8b4b4f280..2db6a64e5d 100755 --- a/frappe/desk/page/setup_wizard/setup_wizard.py +++ b/frappe/desk/page/setup_wizard/setup_wizard.py @@ -352,6 +352,11 @@ def email_setup_wizard_exception(traceback, args): message=message, delayed=False) +def log_setup_wizard_exception(traceback, args): + with open('../logs/setup-wizard.log', 'w+') as setup_log: + setup_log.write(traceback) + setup_log.write(json.dumps(args)) + def get_language_code(lang): return frappe.db.get_value('Language', {'language_name':lang}) diff --git a/frappe/hooks.py b/frappe/hooks.py index 6389985086..d48ac420b1 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -257,7 +257,10 @@ bot_parsers = [ 'frappe.utils.bot.CountBot' ] -setup_wizard_exception = "frappe.desk.page.setup_wizard.setup_wizard.email_setup_wizard_exception" +setup_wizard_exception = [ + "frappe.desk.page.setup_wizard.setup_wizard.email_setup_wizard_exception", + "frappe.desk.page.setup_wizard.setup_wizard.log_setup_wizard_exception" +] before_migrate = ['frappe.patches.v11_0.sync_user_permission_doctype_before_migrate.execute'] after_migrate = ['frappe.website.doctype.website_theme.website_theme.generate_theme_files_if_not_exist'] From fcb54701510fddf8ac511c9a16d5835333c932af Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 11 Mar 2020 12:32:40 +0530 Subject: [PATCH 5/9] fix: use tabs --- frappe/__init__.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index e6b4000524..7cad075e90 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -515,16 +515,14 @@ def whitelist(allow_guest=False, xss_safe=False): return innerfn def timing(f): - - @wraps(f) - def wrap(*args, **kw): - ts = time() - result = f(*args, **kw) - te = time() - print('TIMING: {0} > {1} took: {2:2.4f} sec'.format(f.__module__, f.__name__, te-ts)) - return result - - return wrap + @wraps(f) + def wrap(*args, **kw): + ts = time() + result = f(*args, **kw) + te = time() + print('TIMING: {0} > {1} took: {2:2.4f} sec'.format(f.__module__, f.__name__, te-ts)) + return result + return wrap def read_only(): def innfn(fn): From 3389042656014c79b7c12482daaec7786d492ccf Mon Sep 17 00:00:00 2001 From: Saqib Ansari Date: Thu, 12 Mar 2020 14:33:50 +0530 Subject: [PATCH 6/9] fix: currency field not found in print formats --- frappe/model/meta.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frappe/model/meta.py b/frappe/model/meta.py index 927a56b6b8..fafaefbfd1 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -529,7 +529,9 @@ def get_field_currency(df, doc=None): if currency: ref_docname = doc.name else: - currency = frappe.db.get_value(doc.parenttype, doc.parent, df.get("options")) + if frappe.get_meta(doc.parenttype).has_field(df.get("options")): + # only get_value if parent has currency field + currency = frappe.db.get_value(doc.parenttype, doc.parent, df.get("options")) if currency: frappe.local.field_currency.setdefault((doc.doctype, ref_docname), frappe._dict())\ From 1c5ee0530014d696ec77a20741cfd731cc814639 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Thu, 12 Mar 2020 18:27:29 +0530 Subject: [PATCH 7/9] Revert __init__.py --- frappe/__init__.py | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 7cad075e90..f942e53018 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -10,8 +10,6 @@ from six import iteritems, binary_type, text_type, string_types, PY2 from werkzeug.local import Local, release_local import os, sys, importlib, inspect, json from past.builtins import cmp -from functools import wraps -from time import time from faker import Faker @@ -439,7 +437,7 @@ def sendmail(recipients=[], sender="", subject="No Subject", message="No Message :param recipients: List of recipients. - :param sender: Email sender. Default is current user. + :param sender: Email sender. Default is current user or default outgoing account. :param subject: Email Subject. :param message: (or `content`) Email Content. :param as_markdown: Convert content markdown to HTML. @@ -461,7 +459,6 @@ def sendmail(recipients=[], sender="", subject="No Subject", message="No Message :param args: Arguments for rendering the template :param header: Append header in email """ - text_content = None if template: message, text_content = get_email_from_template(template, args) @@ -514,16 +511,6 @@ def whitelist(allow_guest=False, xss_safe=False): return innerfn -def timing(f): - @wraps(f) - def wrap(*args, **kw): - ts = time() - result = f(*args, **kw) - te = time() - print('TIMING: {0} > {1} took: {2:2.4f} sec'.format(f.__module__, f.__name__, te-ts)) - return result - return wrap - def read_only(): def innfn(fn): def wrapper_fn(*args, **kwargs): @@ -556,7 +543,7 @@ def only_for(roles, message=False): myroles = set(get_roles()) if not roles.intersection(myroles): if message: - msgprint(_('Only for {}').format(', '.join(roles))) + msgprint(_('This action is only allowed for {}').format(bold(', '.join(roles))), _('Not Permitted')) raise PermissionError def get_domain_data(module): From b3b94197a181c8734c29374444623d50bea8beaf Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 14 Mar 2020 12:43:49 +0530 Subject: [PATCH 8/9] chore(deps): [security] bump acorn from 5.7.3 to 5.7.4 (#9695) Bumps [acorn](https://github.com/acornjs/acorn) from 5.7.3 to 5.7.4. **This update includes a security fix.** - [Release notes](https://github.com/acornjs/acorn/releases) - [Commits](https://github.com/acornjs/acorn/compare/5.7.3...5.7.4) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 6de2bd96b2..1b3d0a2176 100644 --- a/yarn.lock +++ b/yarn.lock @@ -392,9 +392,9 @@ ace-builds@^1.4.8: integrity sha512-8ZVAxwyCGAxQX8mOp9imSXH0hoSPkGfy8igJy+WO/7axL30saRhKgg1XPACSmxxPA7nfHVwM+ShWXT+vKsNuFg== acorn@^5.2.1: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== acorn@^6.1.1: version "6.1.1" From 98f5366fac3ff4cada8d00340214bbdeaf82b733 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Sat, 14 Mar 2020 16:16:16 +0530 Subject: [PATCH 9/9] fix: Remove duplicate on_trash key --- frappe/hooks.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frappe/hooks.py b/frappe/hooks.py index f8dde91c7b..cdc6e00bdd 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -134,13 +134,13 @@ doc_events = { ], "on_trash": [ "frappe.desk.notifications.clear_doctype_notifications", - "frappe.workflow.doctype.workflow_action.workflow_action.process_workflow_actions" + "frappe.workflow.doctype.workflow_action.workflow_action.process_workflow_actions", + "frappe.cache_manager.build_table_count_cache" ], "on_change": [ "frappe.social.doctype.energy_point_rule.energy_point_rule.process_energy_points" ], - "after_insert": "frappe.cache_manager.build_table_count_cache", - "on_trash": "frappe.cache_manager.build_table_count_cache", + "after_insert": "frappe.cache_manager.build_table_count_cache" }, "Event": { "after_insert": "frappe.integrations.doctype.google_calendar.google_calendar.insert_event_in_google_calendar",