diff --git a/frappe/__init__.py b/frappe/__init__.py index 743e160aba..28c56f541d 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -615,3 +615,6 @@ def set_filters(jenv): def get_template(path): return get_jenv().get_template(path) + +def get_website_sitemap(doctype, name): + return conn.get_value("Website Sitemap", {"ref_doctype": doctype, "docname": name}) diff --git a/frappe/core/page/data_import_tool/data_import_tool.py b/frappe/core/page/data_import_tool/data_import_tool.py index e493dfe23a..b6c7963813 100644 --- a/frappe/core/page/data_import_tool/data_import_tool.py +++ b/frappe/core/page/data_import_tool/data_import_tool.py @@ -525,7 +525,7 @@ def import_doclist(path, overwrite=False, ignore_links=False, ignore_insert=Fals b = frappe.bean(d) b.ignore_links = ignore_links if insert: - d.doc.fields["__islocal"] = True + b.doc.fields["__islocal"] = True try: b.insert_or_update() except NameError: diff --git a/frappe/patches/4_0/set_website_sitemap_idx.py b/frappe/patches/4_0/set_website_sitemap_idx.py index 315dba76ec..cc90759da9 100644 --- a/frappe/patches/4_0/set_website_sitemap_idx.py +++ b/frappe/patches/4_0/set_website_sitemap_idx.py @@ -2,13 +2,8 @@ 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 + frappe.conn.sql("""update `tab{}` set idx=null""".format(doctype)) + + from frappe.website.doctype.website_sitemap_config.website_sitemap_config import rebuild_website_sitemap_config + rebuild_website_sitemap_config() \ No newline at end of file diff --git a/frappe/public/css/app_icon.css b/frappe/public/css/app_icon.css index 373d931503..955eed855f 100644 --- a/frappe/public/css/app_icon.css +++ b/frappe/public/css/app_icon.css @@ -1,5 +1,6 @@ .app-icon { border-radius: 5px; + overflow: hidden; padding: 20px; display: inline-block; margin: auto; @@ -14,7 +15,7 @@ display: inline-block; } -.app-icon svg { +.app-icon svg, .app-icon img { height: 30px; width: 30px; } @@ -27,6 +28,24 @@ padding: 12px; } +.app-icon-img.app-icon-small { + padding: 0px; + height: 54px; + width: 54px; +} + +.app-icon-img { + padding: 0px; + height: 70px; + width: 70px; +} + +.app-icon-img img { + width: 100%; + height: 100%; +} + + @media (max-width: 768px) { .app-icon { padding: 12px; diff --git a/frappe/public/js/frappe/form/formatters.js b/frappe/public/js/frappe/form/formatters.js index 2a3dd7118f..0482bddf5a 100644 --- a/frappe/public/js/frappe/form/formatters.js +++ b/frappe/public/js/frappe/form/formatters.js @@ -34,7 +34,10 @@ frappe.form.formatters = { return value; if(!value) return ""; - if(docfield && docfield.options) { + if(docfield && docfield.link_onclick) { + return repl('%(value)s', + {onclick: docfield.link_onclick.replace(/"/g, '"'), value:value}); + } else if(docfield && docfield.options) { return repl('%(icon)s%(label)s', { doctype: encodeURIComponent(docfield.options), name: encodeURIComponent(value), diff --git a/frappe/public/js/frappe/ui/listing.js b/frappe/public/js/frappe/ui/listing.js index 8ae59c1411..2c3940f971 100644 --- a/frappe/public/js/frappe/ui/listing.js +++ b/frappe/public/js/frappe/ui/listing.js @@ -350,7 +350,7 @@ frappe.ui.Listing = Class.extend({ var v = filter.field.get_parsed_value(); if(v.indexOf(label)!=-1) { // already set - return false; + return this; } else { // second filter set for this field if(fieldname=='_user_tags') { @@ -372,5 +372,6 @@ frappe.ui.Listing = Class.extend({ this.filter_list.add_filter(doctype, fieldname, '=', label); } } + return this; } }); \ No newline at end of file diff --git a/frappe/public/js/frappe/views/reportview.js b/frappe/public/js/frappe/views/reportview.js index 75daeb0f47..ebde6ec209 100644 --- a/frappe/public/js/frappe/views/reportview.js +++ b/frappe/public/js/frappe/views/reportview.js @@ -222,6 +222,11 @@ frappe.views.ReportView = frappe.ui.Listing.extend({ var docfield = columnDef.docfield; if(docfield.fieldname==="_user_tags") docfield.fieldtype = "Tag"; if(docfield.fieldname==="_comments") docfield.fieldtype = "Comment"; + if(docfield.fieldtype==="Link" && docfield.fieldname!=="name") { + docfield.link_onclick = + repl('frappe.container.page.reportview.set_filter("%(fieldname)s", "%(value)s").page.reportview.run()', + {fieldname:docfield.fieldname, value:value}); + } return frappe.format(value, docfield, null, dataContext); } } diff --git a/frappe/utils/file_manager.py b/frappe/utils/file_manager.py index 4f9c3dac3a..2645f93a99 100644 --- a/frappe/utils/file_manager.py +++ b/frappe/utils/file_manager.py @@ -41,9 +41,9 @@ def save_uploaded(dt, dn): raise Exception def save_url(file_url, dt, dn): - if not (file_url.startswith("http://") or file_url.startswith("https://")): - frappe.msgprint("URL must start with 'http://' or 'https://'") - return None, None + # if not (file_url.startswith("http://") or file_url.startswith("https://")): + # frappe.msgprint("URL must start with 'http://' or 'https://'") + # return None, None f = frappe.bean({ "doctype": "File Data", diff --git a/frappe/website/css/website.css b/frappe/website/css/website.css index 8cf4de4a00..c253c5ce6f 100644 --- a/frappe/website/css/website.css +++ b/frappe/website/css/website.css @@ -4,10 +4,10 @@ } } -h1, h2, h3, h4, h5 { +/*h1, h2, h3, h4, h5 { font-weight: bold; } - +*/ a { cursor: pointer; } diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py index 9ac1084208..d3003b5647 100644 --- a/frappe/website/doctype/blog_post/blog_post.py +++ b/frappe/website/doctype/blog_post/blog_post.py @@ -17,9 +17,6 @@ class DocType(WebsiteGenerator): def get_page_title(self): return self.doc.title - def get_parent_website_sitemap(self): - return frappe.conn.get_value("Website Sitemap", {"ref_doctype": "Blog Category", "docname": self.doc.blog_category}) - def validate(self): if not self.doc.blog_intro: self.doc.blog_intro = self.doc.content[:140] @@ -31,10 +28,14 @@ class DocType(WebsiteGenerator): if self.doc.published and not self.doc.published_on: self.doc.published_on = today() + self.doc.parent_website_sitemap = frappe.conn.get_value("Website Sitemap", + {"ref_doctype": "Blog Category", "docname": self.doc.blog_category}) + # update posts frappe.conn.sql("""update tabBlogger set posts=(select count(*) from `tabBlog Post` where ifnull(blogger,'')=tabBlogger.name) where name=%s""", (self.doc.blogger,)) + def on_update(self): WebsiteGenerator.on_update(self) diff --git a/frappe/website/doctype/blog_post/blog_post.txt b/frappe/website/doctype/blog_post/blog_post.txt index 1c088e44ec..8263ab5e2f 100644 --- a/frappe/website/doctype/blog_post/blog_post.txt +++ b/frappe/website/doctype/blog_post/blog_post.txt @@ -2,7 +2,7 @@ { "creation": "2013-03-28 10:35:30", "docstatus": 0, - "modified": "2014-02-17 13:00:42", + "modified": "2014-02-20 12:55:06", "modified_by": "Administrator", "owner": "Administrator" }, @@ -83,6 +83,15 @@ "label": "Blog Category", "options": "Blog Category" }, + { + "doctype": "DocField", + "fieldname": "parent_website_sitemap", + "fieldtype": "Link", + "hidden": 1, + "label": "Parent Website Sitemap", + "options": "Website Sitemap", + "read_only": 1 + }, { "doctype": "DocField", "fieldname": "section_break_5", diff --git a/frappe/website/doctype/website_sitemap/website_sitemap.py b/frappe/website/doctype/website_sitemap/website_sitemap.py index 4c518f8eff..17a98b1777 100644 --- a/frappe/website/doctype/website_sitemap/website_sitemap.py +++ b/frappe/website/doctype/website_sitemap/website_sitemap.py @@ -45,18 +45,24 @@ class DocType(DocTypeNestedSet): def set_idx(self): if self.doc.idx==None: - self.doc.idx = int(frappe.conn.sql("""select max(ifnull(idx, -1)) from `tabWebsite Sitemap` + self.doc.idx = int(frappe.conn.sql("""select ifnull(max(ifnull(idx, -1)), -1) + from `tabWebsite Sitemap` where ifnull(parent_website_sitemap, '')=%s and name!=%s""", (self.doc.parent_website_sitemap or '', - self.doc.name))[0][0] or 0) + 1 + self.doc.name))[0][0]) + 1 + else: - if cint(self.doc.idx) != 0 and self.doc.parent_website_sitemap: - if not frappe.conn.sql("""select name from `tabWebsite Sitemap` where - ifnull(parent_website_sitemap, '')=%s and ifnull(idx, -1)=%s""", - (self.doc.parent_website_sitemap or '', cint(self.doc.idx) - 1)): - - frappe.throw("{}: {}".format( - _("Sitemap Ordering Error. Index missing"), self.doc.idx-1)) + if self.doc.parent_website_sitemap: + self.doc.idx = cint(self.doc.idx) + previous_idx = frappe.conn.sql("""select max(idx) + from `tab{}` where ifnull(parent_website_sitemap, '')=%s + and ifnull(idx, -1) < %s""".format(self.doc.ref_doctype), + (self.doc.parent_website_sitemap, self.doc.idx))[0][0] + + if previous_idx and previous_idx != self.doc.idx - 1: + frappe.throw("{}: {}, {}".format( + _("Sitemap Ordering Error. Index missing"), self.doc.name, self.doc.idx-1)) + def on_update(self): if not frappe.flags.in_rebuild_config: @@ -138,6 +144,7 @@ def update_sitemap(website_sitemap, options): for key in sitemap_fields: bean.doc.fields[key] = options.get(key) + if not bean.doc.page_name: # for pages bean.doc.page_name = options.link_name diff --git a/frappe/website/doctype/website_sitemap_config/website_sitemap_config.py b/frappe/website/doctype/website_sitemap_config/website_sitemap_config.py index 3c9b92fad9..a59fe2e477 100644 --- a/frappe/website/doctype/website_sitemap_config/website_sitemap_config.py +++ b/frappe/website/doctype/website_sitemap_config/website_sitemap_config.py @@ -32,15 +32,16 @@ class DocType: condition = "" if self.doc.condition_field: condition = " where ifnull(%s, 0)=1" % self.doc.condition_field - + for name in frappe.conn.sql_list("""select name from `tab{doctype}` - {condition} order by {sort_field} {sort_order}""".format( + {condition} order by idx asc, {sort_field} {sort_order}""".format( doctype = self.doc.ref_doctype, condition = condition, sort_field = self.doc.sort_field or "name", sort_order = self.doc.sort_order or "asc" )): - frappe.bean(self.doc.ref_doctype, name).run_method("on_update") + bean = frappe.bean(self.doc.ref_doctype, name) + bean.run_method("on_update") def rebuild_website_sitemap_config(): # TODO diff --git a/frappe/website/website_generator.py b/frappe/website/website_generator.py index fd676e95c5..a79f7ba2e5 100644 --- a/frappe/website/website_generator.py +++ b/frappe/website/website_generator.py @@ -85,7 +85,7 @@ class WebsiteGenerator(DocListController): else: idx = add_to_sitemap(opts) - if idx and self.doc.idx != idx: + if idx!=None and self.doc.idx != idx: frappe.conn.set(self.doc, "idx", idx) def update_permissions(self, opts):