diff --git a/frappe/__init__.py b/frappe/__init__.py index 856123a9f2..2ca2367d99 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -402,9 +402,10 @@ def get_pymodule_path(modulename, *joins): def get_module_list(app_name): return get_file_items(os.path.join(os.path.dirname(get_module(app_name).__file__), "modules.txt")) -def get_all_apps(with_frappe=False): - apps = get_file_items(os.path.join(local.sites_path, "apps.txt")) \ - + get_file_items(os.path.join(local.site_path, "apps.txt")) +def get_all_apps(with_frappe=False, with_internal_apps=True): + apps = get_file_items(os.path.join(local.sites_path, "apps.txt")) + if with_internal_apps: + apps.extend(get_file_items(os.path.join(local.site_path, "apps.txt"))) if with_frappe: apps.insert(0, 'frappe') return apps diff --git a/frappe/cli.py b/frappe/cli.py index 79e95711d0..c7e016ed89 100755 --- a/frappe/cli.py +++ b/frappe/cli.py @@ -8,7 +8,14 @@ import sys, os import frappe -site_arg_optional = [] +site_arg_optional = ['serve'] + +def get_site(parsed_args): + if not parsed_args.get("site") and os.path.exists(os.path.join(parsed_args["sites_path"], "currentsite.txt")): + with open(os.path.join(parsed_args["sites_path"], "currentsite.txt"), "r") as sitefile: + parsed_args["site"] = sitefile.read().strip() + return parsed_args["site"] + return parsed_args.get("site") def main(): parsed_args = frappe._dict(vars(setup_parser())) @@ -28,21 +35,11 @@ def main(): frappe.init(site, sites_path=sites_path) run(fn, args) else: - if not fn in site_arg_optional: - if not parsed_args.get("site") and os.path.exists(os.path.join(sites_path, "currentsite.txt")): - with open(os.path.join(sites_path, "currentsite.txt"), "r") as sitefile: - parsed_args["site"] = sitefile.read().strip() - - site = parsed_args.get("site") - - if not site: - print "Site argument required" - exit(1) - - if fn != 'install' and not os.path.exists(os.path.join(parsed_args["sites_path"], site)): - print "Did not find folder '{}'. Are you in sites folder?".format(parsed_args.get("site")) - exit(1) - + site = get_site(parsed_args) + if fn not in site_arg_optional and not site: + print 'site argument required' + exit(1) + elif site: frappe.init(site, sites_path=sites_path) run(fn, parsed_args) else: @@ -639,7 +636,7 @@ def run_tests(app=None, module=None, doctype=None, verbose=False): exit(1) @cmd -def serve(port=8000, profile=False, sites_path='.'): +def serve(port=8000, profile=False, sites_path='.', site=None): import frappe.app frappe.app.serve(port=port, profile=profile, site=frappe.local.site, sites_path=sites_path) diff --git a/frappe/model/bean.py b/frappe/model/bean.py index 06a31aceb9..ee21b91959 100644 --- a/frappe/model/bean.py +++ b/frappe/model/bean.py @@ -292,10 +292,7 @@ class Bean: def has_permission(self, permtype): return frappe.has_permission(self.doc.doctype, permtype, self.doc) - - def update_value(self, field, value): - frappe.conn.set(self.doc, field, value) - + def save(self, check_links=1, ignore_permissions=None): if ignore_permissions: self.ignore_permissions = ignore_permissions diff --git a/frappe/patches/4_0/set_website_sitemap_idx.py b/frappe/patches/4_0/set_website_sitemap_idx.py new file mode 100644 index 0000000000..315dba76ec --- /dev/null +++ b/frappe/patches/4_0/set_website_sitemap_idx.py @@ -0,0 +1,14 @@ +import frappe + +def execute(): + frappe.conn.sql("""update `tabWebsite Sitemap` set idx=null""") + # frappe.conn.sql("""update `tabWeb Page` set idx=null""") + # frappe.conn.sql("""update `tabBlog Post` set idx=null""") + # frappe.conn.sql("""update `tabBlog Category` set idx=null""") + # frappe.conn.sql("""update `tabWebsite Group` set idx=null""") + # frappe.conn.sql("""delete from `tabTable of Contents`""") + + for doctype in ["Blog Category", "Blog Post", "Web Page", "Website Group"]: + for name in frappe.conn.get_values("Website Sitemap", {"ref_doctype":doctype}, "docname"): + frappe.bean(doctype, name[0]).save() + \ No newline at end of file diff --git a/frappe/public/build.json b/frappe/public/build.json index c8af6e220b..7647fcbe2e 100644 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -41,6 +41,7 @@ "public/css/navbar.css", "public/css/slickgrid.css", "public/css/tree_grid.css", + "public/css/tree.css", "public/css/nprogress.css" ], "js/frappe.min.js": [ diff --git a/frappe/public/css/app.css b/frappe/public/css/app.css index 79eca6804a..ecb2cb179c 100644 --- a/frappe/public/css/app.css +++ b/frappe/public/css/app.css @@ -344,13 +344,6 @@ ul.linked-with-list li { font-weight: bold; } -.tree-node-toolbar { - padding: 2px 5px; - margin-left: 15px; - border-radius: 3px; - background-color: #ddd; -} - .print-preview { padding: 50px 20px; margin: 0px -15px; diff --git a/frappe/public/css/tree.css b/frappe/public/css/tree.css new file mode 100644 index 0000000000..3af785d671 --- /dev/null +++ b/frappe/public/css/tree.css @@ -0,0 +1,31 @@ +.tree li { + list-style: none; +} +.tree ul { + margin-top: 2px; +} +.tree-link { + cursor: pointer; +} +.tree-hover { + background-color: #eee; + min-height: 20px; + border: 1px solid #ddd; +} +.tree-node-toolbar { + display: inline-block; + padding: 0px 5px; + margin-left: 15px; + border-radius: 3px; + background-color: #ddd; +} +.tree-toolbar-item { + display: inline-block; + padding: 0px 5px; + padding-top: 1px; + border-right: 1px solid #aaa; + font-size: 90%; +} +.tree-toolbar-item:last-child { + border-right: 0px; +} \ No newline at end of file diff --git a/frappe/public/js/frappe/ui/tree.js b/frappe/public/js/frappe/ui/tree.js index cbe51f85de..6d97e17c82 100644 --- a/frappe/public/js/frappe/ui/tree.js +++ b/frappe/public/js/frappe/ui/tree.js @@ -16,43 +16,58 @@ frappe.ui.Tree = Class.extend({ parent_label: null, expandable: true }); - this.set_style(); + this.rootnode.toggle(); }, get_selected_node: function() { - return this.$w.find('.tree-link.selected').data('node'); + return this.selected_node; }, - set_style: function() { - frappe.dom.set_style("\ - .tree li { list-style: none; }\ - .tree ul { margin-top: 2px; }\ - .tree-link { cursor: pointer; }\ - ") + toggle: function() { + this.get_selected_node().toggle(); } }) frappe.ui.TreeNode = Class.extend({ init: function(args) { - var me = this; $.extend(this, args); this.loaded = false; this.expanded = false; this.tree.nodes[this.label] = this; if(this.parent_label) this.parent_node = this.tree.nodes[this.parent_label]; + + this.make(); + this.setup_drag_drop(); + + if(this.tree.onrender) { + this.tree.onrender(this); + } + }, + make: function() { + var me = this; this.$a = $('') .click(function() { - if(me.expandable && me.tree.method && !me.loaded) { - me.load() - } else { - me.selectnode(); + me.tree.selected_node = me; + if(me.tree.toolbar) { + me.show_toolbar(); } - if(me.tree.click) me.tree.click(this); + if(me.toggle_on_click) { + me.toggle(); + } + if(me.tree.click) + me.tree.click(this); }) .bind('reload', function() { me.reload(); }) .data('label', this.label) .data('node', this) .appendTo(this.parent); + + this.$ul = $('