diff --git a/frappe/commands/site.py b/frappe/commands/site.py index ab7b337426..d811b2ead4 100644 --- a/frappe/commands/site.py +++ b/frappe/commands/site.py @@ -1584,6 +1584,31 @@ def bypass_patch(context: CliCtxObj, patch_name: str, yes: bool): frappe.destroy() +@click.command("create-desktop-icons-and-sidebar") +@pass_context +def create_icons_and_sidebar(context: CliCtxObj): + """Create desktop icons and workspace sidebars.""" + from frappe.desk.doctype.desktop_icon.desktop_icon import create_desktop_icons + from frappe.desk.doctype.workspace_sidebar.workspace_sidebar import ( + create_workspace_sidebar_for_workspaces, + ) + + if not context.sites: + raise SiteNotSpecifiedError + for site in context.sites: + frappe.init(site) + frappe.connect() + try: + print("Creating Desktop Icons") + create_desktop_icons() + frappe.db.commit() + print("Creating Workspace Sidebars") + create_workspace_sidebar_for_workspaces() + frappe.db.commit() + finally: + frappe.destroy() + + commands = [ add_system_manager, add_user_for_sites, @@ -1620,4 +1645,5 @@ commands = [ trim_database, clear_log_table, bypass_patch, + create_icons_and_sidebar, ] diff --git a/frappe/commands/testing.py b/frappe/commands/testing.py index 2df9a07761..973ccee722 100644 --- a/frappe/commands/testing.py +++ b/frappe/commands/testing.py @@ -437,6 +437,7 @@ def run_parallel_tests( @click.option("--parallel", is_flag=True, help="Run UI Test in parallel mode") @click.option("--with-coverage", is_flag=True, help="Generate coverage report") @click.option("--browser", default="chrome", help="Browser to run tests in") +@click.option("--spec", help="Spec file to run") @click.option("--ci-build-id") @pass_context def run_ui_tests( @@ -448,6 +449,7 @@ def run_ui_tests( browser="chrome", ci_build_id=None, cypressargs=None, + spec=None, ): "Run UI tests" site = get_site(context) @@ -494,6 +496,8 @@ def run_ui_tests( # run for headless mode run_or_open = f"run --browser {browser}" if headless else "open" + if headless and spec: + run_or_open += f" --spec {spec}" formatted_command = f"{site_env} {password_env} {coverage_env} {cypress_path} {run_or_open}" if os.environ.get("CYPRESS_RECORD_KEY"): diff --git a/frappe/desk/doctype/desktop_icon/desktop_icon.py b/frappe/desk/doctype/desktop_icon/desktop_icon.py index 95dba2fa75..afa429dbf2 100644 --- a/frappe/desk/doctype/desktop_icon/desktop_icon.py +++ b/frappe/desk/doctype/desktop_icon/desktop_icon.py @@ -634,7 +634,7 @@ def create_desktop_icons_from_workspace(): if app_icon: icon.parent_icon = app_icon - # Portal App (CRM Or Helpdesk) With Desk Workspace + # Portal App With Desk Workspace if not frappe.db.get_value("Desktop Icon", app_icon, "link").startswith("/app"): icon.hidden = 1 icon.parent_icon = None @@ -645,21 +645,12 @@ def create_desktop_icons_from_workspace(): ): icon.hidden = 1 icon.parent_icon = None - print(f"Label {icon.label}") - print(f"Icon Type {icon.icon_type}") - print(f"Link Type {icon.link_type}") + try: if not frappe.db.exists("Desktop Icon", [{"label": icon.label, "icon_type": icon.icon_type}]): icon.insert(ignore_if_duplicate=True) except Exception as e: print(f"Error occurred while inserting icon: {e}") - existing_icon = frappe.db.exists("Desktop Icon", [{"label": icon.label}]) - if existing_icon: - old_icon = frappe.get_doc("Desktop Icon", existing_icon) - print("Existing Icon Found:") - print(f"Label {old_icon.label}") - print(f"Icon Type {old_icon.icon_type}") - print(f"Link Type {old_icon.link_type}") def generate_color(): diff --git a/frappe/installer.py b/frappe/installer.py index 2ce4760f31..f0827d5315 100644 --- a/frappe/installer.py +++ b/frappe/installer.py @@ -17,8 +17,6 @@ from semantic_version import Version import frappe from frappe.defaults import _clear_cache -from frappe.desk.doctype.desktop_icon.desktop_icon import create_desktop_icons, sync_desktop_icons -from frappe.desk.doctype.workspace_sidebar.workspace_sidebar import create_workspace_sidebar_for_workspaces from frappe.utils import cint, is_git_url from frappe.utils.dashboard import sync_dashboards from frappe.utils.synchronization import filelock @@ -339,8 +337,6 @@ def install_app(name, verbose=False, set_as_patched=True, force=False): sync_fixtures(name) sync_customizations(name) sync_dashboards(name) - create_desktop_icons() - create_workspace_sidebar_for_workspaces() for after_sync in app_hooks.after_sync or []: frappe.get_attr(after_sync)() # diff --git a/frappe/migrate.py b/frappe/migrate.py index f336f9bb14..623fa1bcbe 100644 --- a/frappe/migrate.py +++ b/frappe/migrate.py @@ -21,8 +21,6 @@ from frappe.core.doctype.navbar_settings.navbar_settings import sync_standard_it from frappe.core.doctype.scheduled_job_type.scheduled_job_type import sync_jobs from frappe.database.schema import add_column from frappe.deferred_insert import save_to_db as flush_deferred_inserts -from frappe.desk.doctype.desktop_icon.desktop_icon import create_desktop_icons -from frappe.desk.doctype.workspace_sidebar.workspace_sidebar import create_workspace_sidebar_for_workspaces from frappe.desk.notifications import clear_notifications from frappe.modules.patch_handler import PatchType from frappe.modules.utils import sync_customizations @@ -190,12 +188,6 @@ class SiteMigration: print("Updating installed applications...") frappe.get_single("Installed Applications").update_versions() - print("Creating Desktop Icons...") - create_desktop_icons() - - print("Creating Workspace Sidebars..") - create_workspace_sidebar_for_workspaces() - print("Executing `after_migrate` hooks...") for app in frappe.get_installed_apps(): for fn in frappe.get_hooks("after_migrate", app_name=app):