diff --git a/frappe/__init__.py b/frappe/__init__.py index ce7ce7699b..90f01b3b98 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -305,10 +305,6 @@ def init(site: str, sites_path: str = ".", new_site: bool = False, force=False) local.initialised = True - # Set the user as database name if not set in config - if local.conf and local.conf.db_name is not None and local.conf.db_user is None: - local.conf.db_user = local.conf.db_name - def connect( site: str | None = None, db_name: str | None = None, set_admin_as_user: bool = True @@ -316,7 +312,7 @@ def connect( """Connect to site database instance. :param site: (Deprecated) If site is given, calls `frappe.init`. - :param db_name: Optional. Will use from `site_config.json`. + :param db_name: (Deprecated) Optional. Will use from `site_config.json`. :param set_admin_as_user: Set Administrator as current user. """ from frappe.database import get_db @@ -329,13 +325,24 @@ def connect( "Instead, explicitly invoke frappe.init(site) prior to calling frappe.connect(), if initializing the site is necessary." ) init(site) + if db_name: + from frappe.utils.deprecations import deprecation_warning + + deprecation_warning( + "Calling frappe.connect with the db_name argument is deprecated and will be removed in next major version. " + "Instead, explicitly invoke frappe.init(site) with the right config prior to calling frappe.connect(), if necessary." + ) + + assert db_name or local.conf.db_user, "site must be fully initialized, db_user missing" + assert db_name or local.conf.db_name, "site must be fully initialized, db_name missing" + assert local.conf.db_password, "site must be fully initialized, db_password missing" local.db = get_db( host=local.conf.db_host, port=local.conf.db_port, - user=local.conf.db_user or db_name or local.conf.db_name, + user=local.conf.db_user or db_name, password=local.conf.db_password, - cur_db_name=db_name or local.conf.db_name, + cur_db_name=local.conf.db_name or db_name, ) if set_admin_as_user: set_user("Administrator") @@ -423,6 +430,11 @@ def get_site_config(sites_path: str | None = None, site_path: str | None = None) os.environ.get("FRAPPE_DB_PORT") or config.get("db_port") or db_default_ports(config["db_type"]) ) + # Set the user as database name if not set in config + config["db_user"] = ( + os.environ.get("FRAPPE_DB_USER") or config.get("db_user") or config.get("db_name") + ) + return config diff --git a/frappe/commands/utils.py b/frappe/commands/utils.py index a839566130..a6eedf102a 100644 --- a/frappe/commands/utils.py +++ b/frappe/commands/utils.py @@ -772,12 +772,11 @@ def run_tests( click.secho(f"bench --site {site} set-config allow_tests true", fg="green") return - frappe.init(site=site) - frappe.flags.skip_before_tests = skip_before_tests frappe.flags.skip_test_records = skip_test_records ret = frappe.test_runner.main( + site, app, module, doctype, diff --git a/frappe/database/__init__.py b/frappe/database/__init__.py index 7cd2dda4a9..178ad80fc9 100644 --- a/frappe/database/__init__.py +++ b/frappe/database/__init__.py @@ -23,17 +23,17 @@ def setup_database(force, verbose=None, no_mariadb_socket=False): ) -def bootstrap_database(db_name, verbose=None, source_sql=None): +def bootstrap_database(verbose=None, source_sql=None): import frappe if frappe.conf.db_type == "postgres": import frappe.database.postgres.setup_db - return frappe.database.postgres.setup_db.bootstrap_database(db_name, verbose, source_sql) + return frappe.database.postgres.setup_db.bootstrap_database(verbose, source_sql) else: import frappe.database.mariadb.setup_db - return frappe.database.mariadb.setup_db.bootstrap_database(db_name, verbose, source_sql) + return frappe.database.mariadb.setup_db.bootstrap_database(verbose, source_sql) def drop_user_and_database(db_name, db_user): diff --git a/frappe/database/mariadb/setup_db.py b/frappe/database/mariadb/setup_db.py index 6dc3e9ecb2..28fa232022 100644 --- a/frappe/database/mariadb/setup_db.py +++ b/frappe/database/mariadb/setup_db.py @@ -67,17 +67,17 @@ def drop_user_and_database( dbman.delete_user(db_user) -def bootstrap_database(db_name, verbose, source_sql=None): +def bootstrap_database(verbose, source_sql=None): import sys - frappe.connect(db_name=db_name) + frappe.connect() if not check_database_settings(): print("Database settings do not match expected values; stopping database setup.") sys.exit(1) import_db_from_sql(source_sql, verbose) - frappe.connect(db_name=db_name) + frappe.connect() if "tabDefaultValue" not in frappe.db.get_tables(cached=False): from click import secho diff --git a/frappe/database/postgres/setup_db.py b/frappe/database/postgres/setup_db.py index 855f31b89c..ba45af4cad 100644 --- a/frappe/database/postgres/setup_db.py +++ b/frappe/database/postgres/setup_db.py @@ -29,11 +29,12 @@ def setup_database(): root_conn.close() -def bootstrap_database(db_name, verbose, source_sql=None): - frappe.connect(db_name=db_name) - import_db_from_sql(source_sql, verbose) - frappe.connect(db_name=db_name) +def bootstrap_database(verbose, source_sql=None): + frappe.connect() + import_db_from_sql(source_sql, verbose) + + frappe.connect() if "tabDefaultValue" not in frappe.db.get_tables(): import sys diff --git a/frappe/desk/form/test_form.py b/frappe/desk/form/test_form.py index f256b03d27..5028fedf96 100644 --- a/frappe/desk/form/test_form.py +++ b/frappe/desk/form/test_form.py @@ -11,10 +11,3 @@ class TestForm(FrappeTestCase): results = get_linked_docs("Role", "System Manager", linkinfo=get_linked_doctypes("Role")) self.assertTrue("User" in results) self.assertTrue("DocType" in results) - - -if __name__ == "__main__": - import unittest - - frappe.connect() - unittest.main() diff --git a/frappe/installer.py b/frappe/installer.py index 2f7138cb48..68fd4d87d2 100644 --- a/frappe/installer.py +++ b/frappe/installer.py @@ -20,9 +20,10 @@ from frappe.utils.dashboard import sync_dashboards from frappe.utils.synchronization import filelock -def _is_scheduler_enabled() -> bool: +def _is_scheduler_enabled(site) -> bool: enable_scheduler = False try: + frappe.init(site=site) frappe.connect() enable_scheduler = cint(frappe.db.get_single_value("System Settings", "enable_scheduler")) except Exception: @@ -78,7 +79,7 @@ def _new_site( try: # enable scheduler post install? - enable_scheduler = _is_scheduler_enabled() + enable_scheduler = _is_scheduler_enabled(site) except Exception: enable_scheduler = False @@ -170,7 +171,6 @@ def install_db( setup_database(force, verbose, no_mariadb_socket) bootstrap_database( - db_name=frappe.conf.db_name, verbose=verbose, source_sql=source_sql, ) diff --git a/frappe/integrations/offsite_backup_utils.py b/frappe/integrations/offsite_backup_utils.py index e2e2fed40f..a71fe0e28d 100644 --- a/frappe/integrations/offsite_backup_utils.py +++ b/frappe/integrations/offsite_backup_utils.py @@ -41,9 +41,6 @@ def send_email(success, service_name, doctype, email_field, error_status=None): def get_recipients(doctype, email_field): - if not frappe.db: - frappe.connect() - return split_emails(frappe.db.get_value(doctype, None, email_field)) diff --git a/frappe/test_runner.py b/frappe/test_runner.py index 635c2a9c6a..9c072ae8e4 100644 --- a/frappe/test_runner.py +++ b/frappe/test_runner.py @@ -38,6 +38,7 @@ def xmlrunner_wrapper(output): def main( + site=None, app=None, module=None, doctype=None, @@ -53,6 +54,10 @@ def main( ): global unittest_runner + frappe.init(site=site) + if not frappe.db: + frappe.connect() + if doctype_list_path: app, doctype_list_path = doctype_list_path.split(os.path.sep, 1) with open(frappe.get_app_path(app, doctype_list_path)) as f: @@ -69,9 +74,6 @@ def main( frappe.flags.print_messages = verbose frappe.flags.in_test = True - if not frappe.db: - frappe.connect() - # workaround! since there is no separate test db frappe.clear_cache() scheduler_disabled_by_user = frappe.utils.scheduler.is_scheduler_disabled(verbose=False) @@ -342,9 +344,6 @@ def _add_test(app, path, filename, verbose, test_suite=None): def make_test_records(doctype, verbose=0, force=False, commit=False): - if not frappe.db: - frappe.connect() - if frappe.flags.skip_test_records: return diff --git a/frappe/tests/test_commands.py b/frappe/tests/test_commands.py index 7eff954054..fc39adc9a3 100644 --- a/frappe/tests/test_commands.py +++ b/frappe/tests/test_commands.py @@ -173,14 +173,18 @@ class BaseTestCommands(FrappeTestCase): cmd_config = { "test_site": TEST_SITE, "admin_password": frappe.conf.admin_password, - "root_login": frappe.conf.root_login, - "root_password": frappe.conf.root_password, "db_type": frappe.conf.db_type, + "db_root_username": frappe.conf.root_login, + "db_root_password": frappe.conf.root_password, } if not os.path.exists(os.path.join(TEST_SITE, "site_config.json")): cls.execute( - "bench new-site {test_site} --admin-password {admin_password} --db-type" " {db_type}", + "bench new-site {test_site} " + "--admin-password {admin_password} " + "--db-root-username {db_root_username} " + "--db-root-password {db_root_password} " + "--db-type {db_type}", cmd_config, ) diff --git a/frappe/tests/test_fmt_money.py b/frappe/tests/test_fmt_money.py index fff5011189..0fbd38cbcc 100644 --- a/frappe/tests/test_fmt_money.py +++ b/frappe/tests/test_fmt_money.py @@ -100,10 +100,3 @@ class TestFmtMoney(FrappeTestCase): frappe.db.set_value("Currency", "JPY", "symbol_on_right", 1) self.assertEqual(fmt_money(100.0, format="#,###.##", currency="JPY"), "100.00 ¥") self.assertEqual(fmt_money(100.0, format="#,###.##", currency="USD"), "$ 100.00") - - -if __name__ == "__main__": - import unittest - - frappe.connect() - unittest.main() diff --git a/frappe/translate.py b/frappe/translate.py index 0f9098876f..a0ee8001eb 100644 --- a/frappe/translate.py +++ b/frappe/translate.py @@ -215,9 +215,6 @@ def get_translation_dict_from_file(path, lang, app, throw=False) -> dict[str, st def get_user_translations(lang): - if not frappe.db: - frappe.connect() - def _read_from_db(): user_translations = {} translations = frappe.get_all( @@ -977,9 +974,6 @@ def get_all_languages(with_language_name: bool = False) -> list: def get_all_language_with_name(): return frappe.get_all("Language", ["language_code", "language_name"], {"enabled": 1}) - if not frappe.db: - frappe.connect() - if with_language_name: return frappe.cache.get_value("languages_with_name", get_all_language_with_name) else: