diff --git a/.releaserc b/.releaserc index 86f4f3cda0..ece1a68fa8 100644 --- a/.releaserc +++ b/.releaserc @@ -1,19 +1,22 @@ { - "branches": ["develop", {"name": "version-14-beta", "channel": "beta", "prerelease": true}], + "branches": ["version-17"], "plugins": [ "@semantic-release/commit-analyzer", { - "preset": "angular" + "preset": "angular", + "releaseRules": [ + {"breaking": true, "release": false} + ] }, "@semantic-release/release-notes-generator", [ "@semantic-release/exec", { - "prepareCmd": 'sed -ir "s/[0-9]*\.[0-9]*\.[0-9]*/${nextRelease.version}/" frappe/__init__.py' + "prepareCmd": 'sed -ir -E "s/\"[0-9]+\.[0-9]+\.[0-9]+\"/\"${nextRelease.version}\"/" frappe/__init__.py' } ], [ "@semantic-release/git", { "assets": ["frappe/__init__.py"], - "message": "chore(release): Bumped to Version ${nextRelease.version}" + "message": "chore(release): Bumped to Version ${nextRelease.version}\n\n${nextRelease.notes}" } ], "@semantic-release/github" diff --git a/frappe/__init__.py b/frappe/__init__.py index 3cffd6ffda..11f48eaaa9 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -196,7 +196,7 @@ def init(site: str, sites_path: str = ".", new_site: bool = False, force: bool = local.cache = {} local.form_dict = _dict() local.preload_assets = {"style": [], "script": [], "icons": []} - local.session = _dict(user="Guest") + local.session = _dict(user="Guest", data=_dict()) local.dev_server = _dev_server # only for backwards compatibility local.qb = get_query_builder(local.conf.db_type) if not cache or not client_cache: diff --git a/frappe/boot.py b/frappe/boot.py index c1f572f995..b409e36b99 100644 --- a/frappe/boot.py +++ b/frappe/boot.py @@ -161,8 +161,8 @@ def load_desktop_data(bootinfo): from frappe.desk.desktop import get_workspace_sidebar_items bootinfo.workspaces = get_workspace_sidebar_items() - bootinfo.workspace_sidebar_item = get_sidebar_items() allowed_pages = [d.name for d in bootinfo.workspaces.get("pages")] + bootinfo.workspace_sidebar_item = get_sidebar_items(allowed_pages) bootinfo.module_wise_workspaces = get_controller("Workspace").get_module_wise_workspaces() bootinfo.dashboards = frappe.get_all("Dashboard") bootinfo.app_data = [] @@ -533,7 +533,7 @@ def get_sentry_dsn(): return os.getenv("FRAPPE_SENTRY_DSN") -def get_sidebar_items(): +def get_sidebar_items(allowed_workspaces): from frappe import _ from frappe.desk.doctype.workspace_sidebar.workspace_sidebar import auto_generate_sidebar_from_module @@ -585,7 +585,7 @@ def get_sidebar_items(): if ( "My Workspaces" in sidebar_title or si.type == "Section Break" - or w.is_item_allowed(si.link_to, si.link_type) + or w.is_item_allowed(si.link_to, si.link_type, allowed_workspaces) ): sidebar_items[sidebar_title.lower()]["items"].append(workspace_sidebar) add_user_specific_sidebar(sidebar_items) diff --git a/frappe/core/doctype/doctype/boilerplate/controller_tree.js b/frappe/core/doctype/doctype/boilerplate/controller_tree.js new file mode 100644 index 0000000000..9fc78986e0 --- /dev/null +++ b/frappe/core/doctype/doctype/boilerplate/controller_tree.js @@ -0,0 +1,5 @@ +// Copyright (c) {year}, {app_publisher} and contributors +// For license information, please see license.txt + +// frappe.treeview_settings["{doctype}"] = {{ +// }}; \ No newline at end of file diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index dc3a785a37..1b9f6b50f8 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -877,6 +877,9 @@ class DocType(Document): make_boilerplate("controller.js", self.as_dict()) # make_boilerplate("controller_list.js", self.as_dict()) + if self.is_tree: + make_boilerplate("controller_tree.js", self.as_dict()) + if self.has_web_view: templates_path = frappe.get_module_path( frappe.scrub(self.module), "doctype", frappe.scrub(self.name), "templates" diff --git a/frappe/core/doctype/version/test_version.py b/frappe/core/doctype/version/test_version.py index b99dc6f046..e7f8829ef6 100644 --- a/frappe/core/doctype/version/test_version.py +++ b/frappe/core/doctype/version/test_version.py @@ -3,12 +3,137 @@ import copy import frappe -from frappe.core.doctype.version.version import get_diff -from frappe.tests import IntegrationTestCase +from frappe.core.doctype.version.version import ( + _as_string, + _generate_html_diff, + _should_generate_html_diff, + get_diff, +) +from frappe.tests import IntegrationTestCase, UnitTestCase from frappe.tests.utils import make_test_objects +class TestHTMLDiff(UnitTestCase): + def test_generate_html_diff_produces_table(self): + """Test HTML diff generates a table with content.""" + result = _generate_html_diff("line1\nline2", "line1\nmodified") + + self.assertIsNotNone(result) + self.assertIn("
| {{ frappe.meta.get_label(doc.ref_doctype, item[0]) }} | {{ getEscapedValue(item[1]) }} | {{ getEscapedValue(item[2]) }} |