diff --git a/frappe/commands/site.py b/frappe/commands/site.py index fa9ab4be59..71a6ccb544 100644 --- a/frappe/commands/site.py +++ b/frappe/commands/site.py @@ -398,8 +398,9 @@ def _reinstall( @click.command("install-app") @click.argument("apps", nargs=-1) +@click.option("--force", is_flag=True, default=False) @pass_context -def install_app(context, apps): +def install_app(context, apps, force=False): "Install a new app to site, supports multiple apps" from frappe.installer import install_app as _install_app @@ -414,7 +415,7 @@ def install_app(context, apps): for app in apps: try: - _install_app(app, verbose=context.verbose) + _install_app(app, verbose=context.verbose, force=force) except frappe.IncompatibleApp as err: err_msg = ":\n{}".format(err) if str(err) else "" print("App {} is Incompatible with Site {}{}".format(app, site, err_msg)) diff --git a/frappe/core/doctype/file/file.py b/frappe/core/doctype/file/file.py index 3547a03832..8ca0b9ea10 100755 --- a/frappe/core/doctype/file/file.py +++ b/frappe/core/doctype/file/file.py @@ -608,7 +608,7 @@ def on_doctype_update(): def make_home_folder(): home = frappe.get_doc( {"doctype": "File", "is_folder": 1, "is_home_folder": 1, "file_name": _("Home")} - ).insert() + ).insert(ignore_if_duplicate=True) frappe.get_doc( { @@ -618,7 +618,7 @@ def make_home_folder(): "is_attachments_folder": 1, "file_name": _("Attachments"), } - ).insert() + ).insert(ignore_if_duplicate=True) @frappe.whitelist() diff --git a/frappe/installer.py b/frappe/installer.py index 634d6287f8..e71c08b859 100644 --- a/frappe/installer.py +++ b/frappe/installer.py @@ -226,7 +226,7 @@ def parse_app_name(name: str) -> str: return repo -def install_app(name, verbose=False, set_as_patched=True): +def install_app(name, verbose=False, set_as_patched=True, force=False): from frappe.core.doctype.scheduled_job_type.scheduled_job_type import sync_jobs from frappe.model.sync import sync_for from frappe.modules.utils import sync_customizations @@ -243,7 +243,7 @@ def install_app(name, verbose=False, set_as_patched=True): if app_hooks.required_apps: for app in app_hooks.required_apps: required_app = parse_app_name(app) - install_app(required_app, verbose=verbose) + install_app(required_app, verbose=verbose, force=force) frappe.flags.in_install = name frappe.clear_cache() @@ -251,7 +251,7 @@ def install_app(name, verbose=False, set_as_patched=True): if name not in frappe.get_all_apps(): raise Exception("App not in apps.txt") - if name in installed_apps: + if not force and name in installed_apps: frappe.msgprint(frappe._("App {0} already installed").format(name)) return @@ -266,7 +266,7 @@ def install_app(name, verbose=False, set_as_patched=True): return if name != "frappe": - add_module_defs(name) + add_module_defs(name, ignore_if_duplicate=force) sync_for(name, force=True, reset_permissions=True) @@ -573,13 +573,13 @@ def make_site_dirs(): os.makedirs(path, exist_ok=True) -def add_module_defs(app): +def add_module_defs(app, ignore_if_duplicate=False): modules = frappe.get_module_list(app) for module in modules: d = frappe.new_doc("Module Def") d.app_name = app d.module_name = module - d.insert(ignore_permissions=True, ignore_if_duplicate=True) + d.insert(ignore_permissions=True, ignore_if_duplicate=ignore_if_duplicate) def remove_missing_apps(): diff --git a/frappe/modules/import_file.py b/frappe/modules/import_file.py index 00483bf6a5..d39f98f966 100644 --- a/frappe/modules/import_file.py +++ b/frappe/modules/import_file.py @@ -144,7 +144,6 @@ def import_file_by_path( import_doc( docdict=doc, - force=force, data_import=data_import, pre_process=pre_process, ignore_version=ignore_version, @@ -203,7 +202,6 @@ def update_modified(original_modified, doc): def import_doc( docdict, - force=False, data_import=False, pre_process=None, ignore_version=None, diff --git a/frappe/utils/install.py b/frappe/utils/install.py index 08a399e5fe..4342fb037f 100644 --- a/frappe/utils/install.py +++ b/frappe/utils/install.py @@ -46,6 +46,7 @@ def after_install(): if not frappe.conf.skip_setup_wizard: frappe.db.set_default("desktop:home_page", "setup-wizard") + frappe.db.set_value("System Settings", "System Settings", "setup_complete", 0) # clear test log with open(frappe.get_site_path(".test_log"), "w") as f: