feat: global frappe.in_test flag (#32960)

* feat: global `frappe.in_test` flag

* feat: helper utility to toggle `frappe.in_test`

* fix: use `toggle_test_mode` util

* fix: use `frappe.in_test`

* chore: add comment explaining global `in_test`

* chore: ignore commit replacing flag usage

* test: temporarily disable `frappe.in_test`

this worked earlier because flag was set in werkzeug.local which was separate for API test client

* test: add comment explaining change
This commit is contained in:
Sagar Vora 2025-06-17 13:49:31 +00:00 committed by GitHub
parent 7e2b4955f8
commit b3e1eda4c8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
49 changed files with 105 additions and 84 deletions

View file

@ -58,3 +58,6 @@ e9bbe03354079cfcef65a77b0c33f57b047a7c93
# ruff update
84ef6ec677c8657c3243ac456a1ef794bfb34a50
# replace `frappe.flags.in_test` with `frappe.in_test`
653c80b8483cc41aef25cd7d66b9b6bb188bf5f8

View file

@ -83,6 +83,9 @@ cache: Optional["RedisWrapper"] = None
client_cache: Optional["ClientCache"] = None
STANDARD_USERS = ("Guest", "Administrator")
# this global may be subsequently changed by frappe.tests.utils.toggle_test_mode()
in_test = False
_dev_server = int(sbool(os.environ.get("DEV_SERVER", False)))
if _dev_server:
@ -219,7 +222,7 @@ def init(site: str, sites_path: str = ".", new_site: bool = False, force: bool =
"in_install_db": False,
"in_install_app": False,
"in_import": False,
"in_test": False,
"in_test": in_test,
"mute_messages": False,
"ignore_links": False,
"mute_emails": False,
@ -640,7 +643,7 @@ def whitelist(allow_guest=False, xss_safe=False, methods=None):
global whitelisted, guest_methods, xss_safe_methods, allowed_http_methods_for_whitelisted_func
# validate argument types only if request is present
in_request_or_test = lambda: getattr(local, "request", None) or local.flags.in_test # noqa: E731
in_request_or_test = lambda: getattr(local, "request", None) or in_test # noqa: E731
# get function from the unbound / bound method
# this is needed because functions can be compared, but not methods
@ -740,7 +743,7 @@ def only_for(roles: list[str] | tuple[str] | str, message=False):
:param roles: Permitted role(s)
"""
if local.flags.in_test or local.session.user == "Administrator":
if in_test or local.session.user == "Administrator":
return
if isinstance(roles, str):
@ -767,7 +770,7 @@ def get_domain_data(module):
else:
return _dict()
except ImportError:
if local.flags.in_test:
if in_test:
return _dict()
else:
raise
@ -1595,7 +1598,7 @@ def copy_doc(doc: "Document", ignore_no_copy: bool = True) -> "Document":
fields_to_clear = ["name", "owner", "creation", "modified", "modified_by"]
if not local.flags.in_test:
if not in_test:
fields_to_clear.append("docstatus")
if isinstance(doc, BaseDocument) or hasattr(doc, "as_dict"):

View file

@ -86,7 +86,7 @@ class AutoRepeat(Document):
validate_template(self.message or "")
def before_insert(self):
if not frappe.flags.in_test:
if not frappe.in_test:
start_date = getdate(self.start_date)
today_date = getdate(today())
if start_date <= today_date:
@ -112,7 +112,7 @@ class AutoRepeat(Document):
frappe.db.set_value(self.reference_doctype, self.reference_document, "auto_repeat", "")
def validate_reference_doctype(self):
if frappe.flags.in_test or frappe.flags.in_patch:
if frappe.in_test or frappe.flags.in_patch:
return
if not frappe.get_meta(self.reference_doctype).allow_auto_repeat:
frappe.throw(
@ -229,7 +229,7 @@ class AutoRepeat(Document):
self.disable_auto_repeat()
if self.reference_document and not frappe.flags.in_test:
if self.reference_document and not frappe.in_test:
self.notify_error_to_user(error_log)
def make_new_document(self):

View file

@ -81,7 +81,7 @@ def make_access_log(
# `frappe.db.commit` added because insert doesnt `commit` when called in GET requests like `printview`
# dont commit in test mode. It must be tempting to put this block along with the in_request in the
# whitelisted method...yeah, don't do it. That part would be executed possibly on a read only DB conn
if not frappe.flags.in_test or in_request:
if not frappe.in_test or in_request:
frappe.db.commit()

View file

@ -101,7 +101,7 @@ class DataImport(Document):
def start_import(self):
from frappe.utils.scheduler import is_scheduler_inactive
run_now = frappe.flags.in_test or frappe.conf.developer_mode
run_now = frappe.in_test or frappe.conf.developer_mode
if is_scheduler_inactive() and not run_now:
frappe.throw(_("Scheduler is inactive. Cannot import data."), title=_("Scheduler Inactive"))

View file

@ -322,7 +322,7 @@ class DocType(Document):
def check_developer_mode(self):
"""Throw exception if not developer mode or via patch"""
if frappe.flags.in_patch or frappe.flags.in_test:
if frappe.flags.in_patch or frappe.in_test:
return
if not frappe.conf.get("developer_mode") and not self.custom:
@ -594,7 +594,7 @@ class DocType(Document):
global_search_fields_after_update.append("name")
if set(global_search_fields_before_update) != set(global_search_fields_after_update):
now = (not frappe.request) or frappe.flags.in_test or frappe.flags.in_install
now = (not frappe.request) or frappe.in_test or frappe.flags.in_install
frappe.enqueue("frappe.utils.global_search.rebuild_for_doctype", now=now, doctype=self.name)
def set_base_class_for_controller(self):

View file

@ -29,7 +29,7 @@ class RoleProfile(Document):
self.clear_cache()
self.queue_action(
"update_all_users",
now=frappe.flags.in_test or frappe.flags.in_install,
now=frappe.in_test or frappe.flags.in_install,
enqueue_after_commit=True,
queue="long",
)

View file

@ -25,6 +25,7 @@ from frappe.model.delete_doc import delete_doc
from frappe.tests import IntegrationTestCase
from frappe.tests.classes.context_managers import change_settings
from frappe.tests.test_api import FrappeAPITestCase
from frappe.tests.utils import toggle_test_mode
from frappe.utils import get_url
user_module = frappe.core.doctype.user.user
@ -212,13 +213,15 @@ class TestUser(IntegrationTestCase):
# test password strength while saving user with new password
user = frappe.get_doc("User", "test@example.com")
frappe.flags.in_test = False
toggle_test_mode(False)
try:
user.new_password = "password"
self.assertRaises(frappe.exceptions.ValidationError, user.save)
user.reload()
user.new_password = "Eastern_43A1W"
user.save()
frappe.flags.in_test = True
finally:
toggle_test_mode(True)
def test_comment_mentions(self):
comment = """

View file

@ -173,7 +173,7 @@ class User(Document):
self.__new_password = self.new_password
self.new_password = ""
if not frappe.flags.in_test:
if not frappe.in_test:
self.password_strength_test()
if self.name not in STANDARD_USERS:
@ -269,7 +269,7 @@ class User(Document):
self.share_with_self()
clear_notifications(user=self.name)
frappe.clear_cache(user=self.name)
now = frappe.flags.in_test or frappe.flags.in_install
now = frappe.in_test or frappe.flags.in_install
self.send_password_notification(self.__new_password)
frappe.enqueue(
"frappe.core.doctype.user.user.create_contact",

View file

@ -94,8 +94,8 @@ def enqueue_create_notification(users: list[str] | str, doc: dict):
"frappe.desk.doctype.notification_log.notification_log.make_notification_logs",
doc=doc,
users=users,
now=frappe.flags.in_test,
enqueue_after_commit=not frappe.flags.in_test,
now=frappe.in_test,
enqueue_after_commit=not frappe.in_test,
)
@ -141,7 +141,7 @@ def send_notification_email(doc: NotificationLog):
template="new_notification",
args=args,
header=[header, "orange"],
now=frappe.flags.in_test,
now=frappe.in_test,
)

View file

@ -57,7 +57,7 @@ def health_check(step: str):
try:
return func(*args, **kwargs)
except Exception as e:
if frappe.flags.in_test:
if frappe.in_test:
raise
frappe.log(frappe.get_traceback())
# nosemgrep

View file

@ -235,7 +235,7 @@ def disable_saving_as_public():
frappe.flags.in_install
or frappe.flags.in_uninstall
or frappe.flags.in_patch
or frappe.flags.in_test
or frappe.in_test
or frappe.flags.in_fixtures
or frappe.flags.in_migrate
)

View file

@ -244,7 +244,7 @@ def update_system_settings(args): # nosemgrep
"date_format": frappe.db.get_value("Country", args.get("country"), "date_format"),
"time_format": frappe.db.get_value("Country", args.get("country"), "time_format"),
"number_format": number_format,
"enable_scheduler": 1 if not frappe.flags.in_test else 0,
"enable_scheduler": 1 if not frappe.in_test else 0,
"backup_limit": 3, # Default for downloadable backups
"enable_telemetry": cint(args.get("enable_telemetry")),
}

View file

@ -159,7 +159,7 @@ class EmailAccount(Document):
if self.enable_incoming and self.use_imap and len(self.imap_folder) <= 0:
frappe.throw(_("You need to set one IMAP folder for {0}").format(frappe.bold(self.email_id)))
if frappe.local.flags.in_patch or frappe.local.flags.in_test:
if frappe.local.flags.in_patch or frappe.in_test:
return
use_oauth = self.auth_method == "OAuth"
@ -363,9 +363,7 @@ class EmailAccount(Document):
@property
def _password(self):
raise_exception = not (
self.auth_method == "OAuth" or self.no_smtp_authentication or frappe.flags.in_test
)
raise_exception = not (self.auth_method == "OAuth" or self.no_smtp_authentication or frappe.in_test)
return self.get_password(raise_exception=raise_exception)
@property
@ -565,7 +563,7 @@ class EmailAccount(Document):
self.set_failed_attempts_count(self.get_failed_attempts_count() + 1)
def _disable_broken_incoming_account(self, description):
if frappe.flags.in_test:
if frappe.in_test:
return
self.db_set("enable_incoming", 0)

View file

@ -81,7 +81,7 @@ class EmailDomain(Document):
def validate(self):
"""Validate POP3/IMAP and SMTP connections."""
if frappe.local.flags.in_patch or frappe.local.flags.in_test or frappe.local.flags.in_install:
if frappe.local.flags.in_patch or frappe.in_test or frappe.local.flags.in_install:
return
self.validate_incoming_server_conn()

View file

@ -182,7 +182,7 @@ class EmailQueue(Document):
message = ctx.build_message(recipient.recipient)
if method := get_hook_method("override_email_send"):
method(self, self.sender, recipient.recipient, message)
elif not frappe.flags.in_test or frappe.flags.testing_email:
elif not frappe.in_test or frappe.flags.testing_email:
if ctx.email_account_doc.service == "Frappe Mail":
is_newsletter = self.reference_doctype == "Newsletter"
ctx.frappe_mail_client.send_raw(
@ -200,7 +200,7 @@ class EmailQueue(Document):
ctx.update_recipient_status_to_sent(recipient)
if frappe.flags.in_test and not frappe.flags.testing_email:
if frappe.in_test and not frappe.flags.testing_email:
frappe.flags.sent_mail = message
return
@ -773,7 +773,7 @@ class QueueBuilder:
job_name=frappe.utils.get_job_name(
"send_bulk_emails_for", self.reference_doctype, self.reference_name
),
now=frappe.flags.in_test or send_now,
now=frappe.in_test or send_now,
queue="long",
)

View file

@ -210,7 +210,7 @@ class Newsletter(WebsiteGenerator):
args["message"] = self.get_message(medium="email")
is_auto_commit_set = bool(frappe.db.auto_commit_on_many_writes)
frappe.db.auto_commit_on_many_writes = not frappe.flags.in_test
frappe.db.auto_commit_on_many_writes = not frappe.in_test
frappe.sendmail(
subject=self.subject,
@ -421,7 +421,7 @@ def send_scheduled_email():
frappe.db.set_value("Newsletter", newsletter_name, "email_sent", 0)
newsletter.log_error("Failed to send newsletter")
if not frappe.flags.in_test:
if not frappe.in_test:
frappe.db.commit()
frappe.flags.is_scheduler_running = False

View file

@ -322,7 +322,7 @@ def get_context(context):
"frappe.email.doctype.notification.notification.evaluate_alert",
doc=doc,
alert=self,
now=frappe.flags.in_test,
now=frappe.in_test,
enqueue_after_commit=enqueue_after_commit,
)

View file

@ -95,7 +95,7 @@ def get_unsubcribed_url(reference_doctype, reference_name, email, unsubscribe_me
@frappe.whitelist(allow_guest=True)
def unsubscribe(doctype, name, email):
# unsubsribe from comments and communications
if not frappe.flags.in_test and not verify_request():
if not frappe.in_test and not verify_request():
return
try:

View file

@ -632,7 +632,7 @@ class InboundMail(Email):
def process(self):
"""Create communication record from email."""
if self.is_sender_same_as_receiver() and not self.is_reply():
if frappe.flags.in_test:
if frappe.in_test:
print("WARN: Cannot pull email. Sender same as recipient inbox")
raise SentEmailInInboxError

View file

@ -109,7 +109,7 @@ class SMTPServer:
frappe.request.after_response.add(self.quit)
elif frappe.job:
frappe.job.after_job.add(self.quit)
elif not frappe.flags.in_test:
elif not frappe.in_test:
# Console?
import atexit

View file

@ -115,6 +115,6 @@ def flush_webhook_execution_queue():
"frappe.integrations.doctype.webhook.webhook.enqueue_webhook",
doc=instance.doc,
webhook=instance.webhook,
now=frappe.flags.in_test,
now=frappe.in_test,
queue=instance.webhook.background_jobs_queue or "default",
)

View file

@ -977,7 +977,7 @@ class BaseDocument:
self.set(df.fieldname, cstr(self.get(df.fieldname)).strip())
value = self.get(df.fieldname)
if value not in options and not (frappe.flags.in_test and value.startswith("_T-")):
if value not in options and not (frappe.in_test and value.startswith("_T-")):
# show an elaborate message
prefix = _("Row #{0}:").format(self.idx) if self.get("parentfield") else ""
label = _(self.meta.get_label(df.fieldname))

View file

@ -153,7 +153,7 @@ def delete_doc(
"frappe.model.delete_doc.delete_dynamic_links",
doctype=doc.doctype,
name=doc.name,
now=frappe.flags.in_test,
now=frappe.in_test,
enqueue_after_commit=True,
)

View file

@ -499,7 +499,7 @@ class Document(BaseDocument):
if ignore_permissions is not None:
self.flags.ignore_permissions = ignore_permissions
self.flags.ignore_version = frappe.flags.in_test if ignore_version is None else ignore_version
self.flags.ignore_version = frappe.in_test if ignore_version is None else ignore_version
if self.get("__islocal") or not self.get("name"):
return self.insert()

View file

@ -32,7 +32,7 @@ def get_dynamic_link_map(for_delete=False):
Note: Will not map single doctypes
"""
if getattr(frappe.local, "dynamic_link_map", None) is None or frappe.flags.in_test:
if getattr(frappe.local, "dynamic_link_map", None) is None or frappe.in_test:
# Build from scratch
dynamic_link_map = {}
for df in get_dynamic_links():

View file

@ -90,7 +90,7 @@ class TracedValue:
"""
if value in self.forbidden_values:
if frappe.flags.in_test:
if frappe.in_test:
frappe.throw(f"{self.field_name} cannot be set to {value}", AssertionError)
else:
frappe.throw(f"{self.field_name} cannot be set to {value}")
@ -99,7 +99,7 @@ class TracedValue:
try:
self.custom_validation(obj, value)
except Exception as e:
if frappe.flags.in_test:
if frappe.in_test:
frappe.throw(str(e), AssertionError)
else:
frappe.throw(str(e))

View file

@ -12,7 +12,7 @@ import click
import requests
import frappe
from frappe.tests.utils import make_test_records
from frappe.tests.utils import make_test_records, toggle_test_mode
from .testing.environment import _decorate_all_methods_and_functions_with_type_checker
from .testing.result import TestResult
@ -53,7 +53,7 @@ class ParallelTestRunner:
if self.dry_run:
return
frappe.flags.in_test = True
toggle_test_mode(True)
frappe.clear_cache()
frappe.utils.scheduler.disable_scheduler()
_decorate_all_methods_and_functions_with_type_checker()

View file

@ -70,7 +70,7 @@ class PrintFormat(Document):
and not frappe.local.conf.get("developer_mode")
and not frappe.flags.in_migrate
and not frappe.flags.in_install
and not frappe.flags.in_test
and not frappe.in_test
):
frappe.throw(frappe._("Standard Print Format cannot be updated"))

View file

@ -26,7 +26,7 @@ class PrintStyle(Document):
self.standard == 1
and not frappe.local.conf.get("developer_mode")
and not frappe.flags.in_import
and not frappe.flags.in_test
and not frappe.in_test
):
frappe.throw(frappe._("Standard Print Style cannot be changed. Please duplicate to edit."))

View file

@ -360,7 +360,7 @@ def start(
@administrator_only
def stop(*args, **kwargs):
frappe.client_cache.set_value(RECORDER_INTERCEPT_FLAG, False)
frappe.enqueue(post_process, now=frappe.flags.in_test)
frappe.enqueue(post_process, now=frappe.in_test)
@frappe.whitelist()

View file

@ -199,7 +199,7 @@ def get_csrf_token():
def generate_csrf_token():
frappe.local.session.data.csrf_token = frappe.generate_hash()
if not frappe.flags.in_test:
if not frappe.in_test:
frappe.local.session_obj.update(force=True)

View file

@ -29,7 +29,7 @@ import tomli
import frappe
import frappe.utils.scheduler
from frappe.tests.utils import make_test_records
from frappe.tests.utils import make_test_records, toggle_test_mode
from .runner import TestRunnerError
from .utils import debug_timer
@ -53,7 +53,7 @@ def _initialize_test_environment(site, config):
raise TestRunnerError(f"Failed to connect to the database: {e}") from e
# Set various test-related flags
frappe.flags.in_test = True
toggle_test_mode(True)
frappe.flags.print_messages = logger.getEffectiveLevel() < logging.INFO
frappe.flags.tests_verbose = logger.getEffectiveLevel() < logging.INFO

View file

@ -6,6 +6,7 @@ import requests
import frappe
from frappe.installer import update_site_config
from frappe.tests.test_api import FrappeAPITestCase, suppress_stdout
from frappe.tests.utils import toggle_test_mode
authorization_token = None
@ -88,7 +89,13 @@ class TestResourceAPIV2(FrappeAPITestCase):
def test_copy_document(self):
doc = frappe.get_doc(self.DOCTYPE, self.GENERATED_DOCUMENTS[0])
# disabled temporarily to assert that `docstatus` is not copied outside of tests
toggle_test_mode(False)
try:
response = self.get(self.resource(self.DOCTYPE, doc.name, "copy"))
finally:
toggle_test_mode(True)
self.assertEqual(response.status_code, 200)
data = response.json["data"]

View file

@ -5,6 +5,7 @@ import frappe
from frappe.model.document import Document
from frappe.model.trace import TracedDocument, traced_field
from frappe.tests import UnitTestCase
from frappe.tests.utils import toggle_test_mode
def create_mock_meta(doctype):
@ -107,9 +108,9 @@ class TestTracedFieldContext(UnitTestCase):
def test_traced_field_context_not_in_test_mode(self):
doc = TestDocument()
# Temporarily set frappe.flags.in_test to False
original_in_test = frappe.flags.in_test
frappe.flags.in_test = False
# Temporarily set frappe.in_test to False
original_in_test = frappe.in_test
toggle_test_mode(False)
try:
with self.trace_fields(TestDocument, test_field={"forbidden_values": ["forbidden"]}):
@ -120,7 +121,7 @@ class TestTracedFieldContext(UnitTestCase):
self.assertEqual(doc.test_field, "allowed")
finally:
# Restore the original in_test flag
frappe.flags.in_test = original_in_test
toggle_test_mode(original_in_test)
# After context
doc.test_field = "forbidden"

View file

@ -20,6 +20,7 @@ import frappe
from frappe.installer import parse_app_name
from frappe.model.document import Document
from frappe.tests import IntegrationTestCase, MockedRequestTestCase
from frappe.tests.utils import toggle_test_mode
from frappe.utils import (
add_trackers_to_url,
ceil,
@ -988,9 +989,9 @@ class TestLazyLoader(IntegrationTestCase):
class TestIdenticon(IntegrationTestCase):
def test_get_gravatar(self):
# developers@frappe.io has a gravatar linked so str URL will be returned
frappe.flags.in_test = False
toggle_test_mode(False)
gravatar_url = get_gravatar("developers@frappe.io")
frappe.flags.in_test = True
toggle_test_mode(True)
self.assertIsInstance(gravatar_url, str)
self.assertTrue(gravatar_url.startswith("http"))

View file

@ -7,7 +7,7 @@ UI_TEST_USER = "frappe@example.com"
def whitelist_for_tests(fn):
if frappe.request and not frappe.flags.in_test and not frappe._dev_server:
if frappe.request and not frappe.in_test and not frappe._dev_server:
frappe.throw("Cannot run UI tests. Use a development server with `bench start`")
return frappe.whitelist()(fn)

View file

@ -26,6 +26,12 @@ def check_orpahned_doctypes():
)
def toggle_test_mode(enable: bool):
"""Enable or disable `frappe.in_test` (and related deprecated flag)"""
frappe.in_test = enable
frappe.local.flags.in_test = enable
from frappe.deprecation_dumpster import (
get_tests_CompatFrappeTestCase,
)

View file

@ -269,7 +269,7 @@ def has_gravatar(email: str) -> str:
"""Return gravatar url if user has set an avatar at gravatar.com."""
import requests
if frappe.flags.in_import or frappe.flags.in_install or frappe.flags.in_test:
if frappe.flags.in_import or frappe.flags.in_install or frappe.in_test:
# no gravatar if via upload
# since querying gravatar for every item will be slow
return ""

View file

@ -139,7 +139,7 @@ def enqueue(
"unknown", "v17", "Using enqueue with `job_name` is deprecated, use `job_id` instead."
)
if not is_async and not frappe.flags.in_test:
if not is_async and not frappe.in_test:
from frappe.deprecation_dumpster import deprecation_warning
deprecation_warning(
@ -148,7 +148,7 @@ def enqueue(
"Using enqueue with is_async=False outside of tests is not recommended, use now=True instead.",
)
call_directly = now or (not is_async and not frappe.flags.in_test)
call_directly = now or (not is_async and not frappe.in_test)
if call_directly:
return frappe.call(method, **kwargs)
@ -243,7 +243,9 @@ def execute_job(site, method, event, job_name, kwargs, user=None, is_async=True,
frappe.init(site, force=True)
frappe.connect()
if os.environ.get("CI"):
frappe.flags.in_test = True
from frappe.tests.utils import toggle_test_mode
toggle_test_mode(True)
if user:
frappe.set_user(user)

View file

@ -59,7 +59,7 @@ class UserPermissions:
return user
if not frappe.flags.in_install_db and not frappe.flags.in_test:
if not frappe.flags.in_install_db and not frappe.in_test:
user_doc = frappe.cache.hget("user_doc", self.name, get_user_doc)
if user_doc:
self.doc = frappe.get_doc(user_doc)

View file

@ -136,7 +136,7 @@ class PersonalDataDeletionRequest(Document):
"_anonymize_data",
queue="long",
timeout=3000,
now=frappe.flags.in_test,
now=frappe.in_test,
)
def notify_user_after_deletion(self):

View file

@ -32,7 +32,7 @@ class PersonalDataDownloadRequest(Document):
"generate_file_and_send_mail",
queue="short",
personal_data=personal_data,
now=frappe.flags.in_test,
now=frappe.in_test,
)
def generate_file_and_send_mail(self, personal_data):

View file

@ -79,10 +79,7 @@ class WebForm(WebsiteGenerator):
self.module = frappe.db.get_value("DocType", self.doc_type, "module")
in_user_env = not (
frappe.flags.in_install
or frappe.flags.in_patch
or frappe.flags.in_test
or frappe.flags.in_fixtures
frappe.flags.in_install or frappe.flags.in_patch or frappe.in_test or frappe.flags.in_fixtures
)
if in_user_env and self.is_standard and not frappe.conf.developer_mode:
# only published can be changed for standard web forms

View file

@ -55,7 +55,7 @@ class WebsiteTheme(Document):
not self.custom
and frappe.local.conf.get("developer_mode")
and not frappe.flags.in_import
and not frappe.flags.in_test
and not frappe.in_test
):
self.export_doc()
@ -65,7 +65,7 @@ class WebsiteTheme(Document):
return (
not self.custom
and not frappe.local.conf.get("developer_mode")
and not (frappe.flags.in_import or frappe.flags.in_test or frappe.flags.in_migrate)
and not (frappe.flags.in_import or frappe.in_test or frappe.flags.in_migrate)
)
def on_trash(self):

View file

@ -94,7 +94,7 @@ def get_comment_list(doctype, name):
def get_home_page():
if frappe.local.flags.home_page and not frappe.flags.in_test:
if frappe.local.flags.home_page and not frappe.in_test:
return frappe.local.flags.home_page
def _get_home_page():

View file

@ -155,7 +155,7 @@ class WebsiteGenerator(Document):
def remove_old_route_from_index(self):
"""Remove page from the website index if the route has changed."""
if self.allow_website_search_indexing() or frappe.flags.in_test:
if self.allow_website_search_indexing() or frappe.in_test:
return
old_doc = self.get_doc_before_save()
# Check if the route is changed
@ -169,7 +169,7 @@ class WebsiteGenerator(Document):
- remove document from index if document is unpublished
- update index otherwise
"""
if not self.allow_website_search_indexing() or frappe.flags.in_test:
if not self.allow_website_search_indexing() or frappe.in_test:
return
if self.is_website_published():

View file

@ -122,7 +122,7 @@ def process_workflow_actions(doc, state):
doc=doc,
transitions=next_possible_transitions,
enqueue_after_commit=True,
now=frappe.flags.in_test,
now=frappe.in_test,
)

View file

@ -56,7 +56,7 @@ def get(doctype, txt=None, limit_start=0, limit=20, pathname=None, **kwargs):
new_context.doc = frappe.get_doc(doc.doctype, doc.name)
new_context.update(new_context.doc.as_dict())
if not frappe.flags.in_test:
if not frappe.in_test:
pathname = pathname or frappe.local.request.path
new_context["pathname"] = pathname.strip("/ ")
new_context.update(list_context)