diff --git a/frappe/__init__.py b/frappe/__init__.py index cb2586b728..532249fae8 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -569,14 +569,21 @@ def get_all_apps(with_frappe=False, with_internal_apps=True, sites_path=None): if with_internal_apps: apps.extend(get_file_items(os.path.join(local.site_path, "apps.txt"))) if with_frappe: + if "frappe" in apps: + apps.remove("frappe") apps.insert(0, 'frappe') return apps -def get_installed_apps(): +def get_installed_apps(sort=False): """Get list of installed apps in current site.""" if getattr(flags, "in_install_db", True): return [] + installed = json.loads(db.get_global("installed_apps") or "[]") + + if sort: + installed = [app for app in get_all_apps(True) if app in installed] + return installed @whitelist() @@ -715,8 +722,8 @@ def call(fn, *args, **kwargs): fnargs, varargs, varkw, defaults = inspect.getargspec(fn) newargs = {} - for a in fnargs: - if a in kwargs: + for a in kwargs: + if (a in fnargs) or varkw: newargs[a] = kwargs.get(a) if "flags" in newargs: diff --git a/frappe/frappeclient.py b/frappe/frappeclient.py index e820a29ebe..3a8137d372 100644 --- a/frappe/frappeclient.py +++ b/frappe/frappeclient.py @@ -164,9 +164,14 @@ class FrappeClient(object): new_doc = frappe.get_doc(doc) new_doc.insert() - if doctype != "Comment" and not meta.istable: - self.migrate_doctype("Comment", {"comment_doctype": doctype, "comment_docname": doc["name"]}, - update={"comment_docname": new_doc.name}, verbose=0) + if not meta.istable: + if doctype != "Comment": + self.migrate_doctype("Comment", {"comment_doctype": doctype, "comment_docname": doc["name"]}, + update={"comment_docname": new_doc.name}, verbose=0) + + if doctype != "File Data": + self.migrate_doctype("File Data", {"attached_to_doctype": doctype, + "attached_to_name": doc["name"]}, update={"attached_to_name": new_doc.name}, verbose=0) def migrate_single(self, doctype): doc = self.get_doc(doctype, doctype) diff --git a/frappe/public/css/website.css b/frappe/public/css/website.css index 5cc67698c2..4a683d1ee9 100644 --- a/frappe/public/css/website.css +++ b/frappe/public/css/website.css @@ -521,9 +521,6 @@ a.active { pointer-events: none; cursor: default; } -:target { - background-color: #ffa; -} .page-breadcrumbs .breadcrumb { padding: 0px; background-color: transparent; @@ -547,9 +544,6 @@ a.active { .docs-attr-desc { padding-left: 30px; } -.page-content { - min-height: 400px; -} @media (max-width: 767px) { .page-content { min-height: 200px; diff --git a/frappe/public/less/website.less b/frappe/public/less/website.less index dc6b82c489..d07b6d8ad0 100644 --- a/frappe/public/less/website.less +++ b/frappe/public/less/website.less @@ -278,9 +278,9 @@ a.active { cursor: default; } -:target { - background-color: #ffa; -} +// :target { +// background-color: #ffa; +// } .page-breadcrumbs .breadcrumb { padding: 0px; @@ -311,11 +311,6 @@ a.active { padding-left: 30px; } - -.page-content { - min-height: 400px; -} - @media (max-width: 767px) { .page-content { min-height: 200px; diff --git a/frappe/templates/includes/list/list.js b/frappe/templates/includes/list/list.js index 795b074d09..ed6fb2adc2 100644 --- a/frappe/templates/includes/list/list.js +++ b/frappe/templates/includes/list/list.js @@ -3,13 +3,16 @@ frappe.ready(function() { var result_wrapper = $(".website-list .result"); $(".website-list .btn-more").on("click", function() { + var data = $.extend(get_query_params(), { + doctype: "{{ doctype }}", + txt: "{{ txt or '' }}", + limit_start: next_start, + pathname: location.pathname + }); + return $.ajax({ url:"/api/method/frappe.templates.pages.list.get", - data: { - doctype: "{{ doctype }}", - txt: "{{ txt or '' }}", - limit_start: next_start - }, + data: data, statusCode: { 200: function(data) { var data = data.message; @@ -28,4 +31,4 @@ frappe.ready(function() { $(".website-list .more-block").addClass("hide"); } }; -}) +}); diff --git a/frappe/templates/pages/list.py b/frappe/templates/pages/list.py index 900f61e233..d37474fc28 100644 --- a/frappe/templates/pages/list.py +++ b/frappe/templates/pages/list.py @@ -5,6 +5,7 @@ from __future__ import unicode_literals import frappe from frappe.model.base_document import get_controller from frappe.utils import cint +from frappe.website.render import resolve_path no_cache = 1 no_sitemap = 1 @@ -30,7 +31,14 @@ def get(doctype, txt=None, limit_start=0, **kwargs): limit_start = cint(limit_start) limit_page_length = 20 next_start = limit_start + limit_page_length + filters = frappe._dict(kwargs) + if filters.pathname: + # resolve additional filters from path + resolve_path(filters.pathname) + for key, val in frappe.local.form_dict.items(): + if not (key in ("doctype", "txt", "limit_start") and key in filters): + filters[key] = val controller = get_controller(doctype) meta = frappe.get_meta(doctype) diff --git a/frappe/utils/jinja.py b/frappe/utils/jinja.py index 41a32b42c1..3469f099b9 100644 --- a/frappe/utils/jinja.py +++ b/frappe/utils/jinja.py @@ -91,11 +91,8 @@ def get_jloader(): if not frappe.local.jloader: from jinja2 import ChoiceLoader, PackageLoader, PrefixLoader - apps = frappe.get_installed_apps() - - # put frappe at the end - apps.remove("frappe") - apps.append("frappe") + apps = frappe.get_installed_apps(sort=True) + apps.reverse() frappe.local.jloader = ChoiceLoader( # search for something like app/templates/... diff --git a/frappe/website/context.py b/frappe/website/context.py index fc5860070c..6822c1013a 100644 --- a/frappe/website/context.py +++ b/frappe/website/context.py @@ -42,6 +42,8 @@ def build_context(context): """get_context method of doc or module is supposed to render content templates and push it into context""" context = frappe._dict(context) context.update(get_website_settings()) + context.update(frappe.get_hooks("website_context") or {}) + context.update(frappe.local.conf.get("website_context") or {}) # provide doc if context.doc: @@ -75,7 +77,6 @@ def build_context(context): context.children = module.get_children(context) add_metatags(context) - context.update(frappe.get_hooks("website_context") or {}) # determine templates to be used if not context.base_template_path: diff --git a/frappe/website/js/website.js b/frappe/website/js/website.js index 889ce36dd7..a230925455 100644 --- a/frappe/website/js/website.js +++ b/frappe/website/js/website.js @@ -459,6 +459,36 @@ function get_url_arg(name) { return decodeURIComponent(results[1]); } +function get_query_params() { + var query_params = {}; + var query_string = location.search.substring(1); + var query_list = query_string.split("&"); + for (var i=0, l=query_list.length; i < l; i++ ){ + var pair = query_list[i].split("="); + var key = pair[0]; + if (!key) { + continue; + } + + var value = pair[1]; + if (typeof value === "string") { + value = decodeURIComponent(value); + } + + if (key in query_params) { + if (typeof query_params[key] === undefined) { + query_params[key] = []; + } else if (typeof query_params[key] === "string") { + query_params[key] = [query_params[key]]; + } + query_params[key].push(value); + } else { + query_params[key] = value; + } + } + return query_params; +} + function make_query_string(obj) { var query_params = []; $.each(obj, function(k, v) { query_params.push(encodeURIComponent(k) + "=" + encodeURIComponent(v)); });