@@ -596,9 +596,6 @@ def get_list(doctype, filters=None, fields=None, or_filters=None, docstatus=None | |||||
run_query = get_list | run_query = get_list | ||||
def get_website_route(doctype, name): | |||||
return db.get_value("Website Route", {"ref_doctype": doctype, "docname": name}) | |||||
def add_version(doc): | def add_version(doc): | ||||
get_doc({ | get_doc({ | ||||
"doctype": "Version", | "doctype": "Version", | ||||
@@ -233,7 +233,7 @@ def setup_utilities(parser): | |||||
parser.add_argument("--clear_web", default=False, action="store_true", | parser.add_argument("--clear_web", default=False, action="store_true", | ||||
help="Clear website cache") | help="Clear website cache") | ||||
parser.add_argument("--build_website", default=False, action="store_true", | parser.add_argument("--build_website", default=False, action="store_true", | ||||
help="Build Website Route") | |||||
help="Sync statics and clear cache") | |||||
parser.add_argument("--sync_statics", default=False, action="store_true", | parser.add_argument("--sync_statics", default=False, action="store_true", | ||||
help="Sync files from templates/statics to Web Pages") | help="Sync files from templates/statics to Web Pages") | ||||
parser.add_argument("--clear_cache", default=False, action="store_true", | parser.add_argument("--clear_cache", default=False, action="store_true", | ||||
@@ -47,13 +47,6 @@ def get_data(): | |||||
"name": "Website Settings", | "name": "Website Settings", | ||||
"description": _("Setup of top navigation bar, footer and logo."), | "description": _("Setup of top navigation bar, footer and logo."), | ||||
}, | }, | ||||
{ | |||||
"type": "page", | |||||
"name":"sitemap-browser", | |||||
"label": _("Sitemap Browser"), | |||||
"description": _("View or manage Website Route tree."), | |||||
"icon": "icon-sitemap" | |||||
}, | |||||
{ | { | ||||
"type": "doctype", | "type": "doctype", | ||||
"name": "Style Settings", | "name": "Style Settings", | ||||
@@ -58,13 +58,7 @@ class Comment(Document): | |||||
# use sql, so that we do not mess with the timestamp | # use sql, so that we do not mess with the timestamp | ||||
frappe.db.sql("""update `tab%s` set `_comments`=%s where name=%s""" % (self.comment_doctype, | frappe.db.sql("""update `tab%s` set `_comments`=%s where name=%s""" % (self.comment_doctype, | ||||
"%s", "%s"), (json.dumps(_comments), self.comment_docname)) | "%s", "%s"), (json.dumps(_comments), self.comment_docname)) | ||||
# clear parent cache if route exists: | |||||
route = frappe.db.get_value("Website Route", {"ref_doctype": self.comment_doctype, | |||||
"docname": self.comment_docname}) | |||||
if route: | |||||
clear_cache(route) | |||||
clear_cache(route) | |||||
def on_trash(self): | def on_trash(self): | ||||
if (self.comment_type or "Comment") != "Comment": | if (self.comment_type or "Comment") != "Comment": | ||||
@@ -1,6 +1,4 @@ | |||||
import frappe | import frappe | ||||
def execute(): | def execute(): | ||||
if frappe.db.exists("Website Route", "index"): | |||||
frappe.delete_doc("Website Route", "index", ignore_permissions=True) | |||||
pass |
@@ -18,13 +18,13 @@ def execute(): | |||||
rename_field_if_exists(d, "parent_website_sitemap", "parent_website_route") | rename_field_if_exists(d, "parent_website_sitemap", "parent_website_route") | ||||
#frappe.reload_doc("website", "doctype", "website_template") | #frappe.reload_doc("website", "doctype", "website_template") | ||||
frappe.reload_doc("website", "doctype", "website_route") | |||||
#frappe.reload_doc("website", "doctype", "website_route") | |||||
frappe.reload_doc("website", "doctype", "website_route_permission") | frappe.reload_doc("website", "doctype", "website_route_permission") | ||||
#rename_field_if_exists("Website Route", "website_sitemap_config", "website_template") | #rename_field_if_exists("Website Route", "website_sitemap_config", "website_template") | ||||
rename_field_if_exists("Website Route Permission", "website_sitemap", "website_route") | rename_field_if_exists("Website Route Permission", "website_sitemap", "website_route") | ||||
for d in ("blog_category", "blog_post", "web_page", "website_route", "website_group", "post", "user_vote"): | |||||
for d in ("blog_category", "blog_post", "web_page", "website_group", "post", "user_vote"): | |||||
frappe.reload_doc("website", "doctype", d) | frappe.reload_doc("website", "doctype", d) | ||||
def rename_field_if_exists(doctype, old_fieldname, new_fieldname): | def rename_field_if_exists(doctype, old_fieldname, new_fieldname): | ||||
@@ -12,10 +12,10 @@ def execute(): | |||||
frappe.reload_doc("website", "doctype", "website_settings") | frappe.reload_doc("website", "doctype", "website_settings") | ||||
original_home_page = frappe.db.get_value("Website Settings", "Website Settings", "home_page") | |||||
home_page = frappe.db.sql("""select name from `tabWebsite Route` | |||||
where (name=%s or docname=%s) and name!='index'""", (original_home_page, original_home_page)) | |||||
home_page = home_page[0][0] if home_page else original_home_page | |||||
frappe.db.set_value("Website Settings", "Website Settings", "home_page", home_page) | |||||
# original_home_page = frappe.db.get_value("Website Settings", "Website Settings", "home_page") | |||||
# | |||||
# home_page = frappe.db.sql("""select name from `tabWebsite Route` | |||||
# where (name=%s or docname=%s) and name!='index'""", (original_home_page, original_home_page)) | |||||
# home_page = home_page[0][0] if home_page else original_home_page | |||||
# | |||||
# frappe.db.set_value("Website Settings", "Website Settings", "home_page", home_page) |
@@ -3,4 +3,5 @@ import frappe | |||||
def execute(): | def execute(): | ||||
# clear all static web pages | # clear all static web pages | ||||
frappe.delete_doc("DocType", "Website Route", force=1) | frappe.delete_doc("DocType", "Website Route", force=1) | ||||
frappe.delete_doc("Page", "sitemap-browser", force=1) | |||||
frappe.db.sql("drop table `tabWebsite Route`") | frappe.db.sql("drop table `tabWebsite Route`") |
@@ -6,7 +6,7 @@ from __future__ import unicode_literals | |||||
import urllib | import urllib | ||||
import frappe | import frappe | ||||
from frappe.utils import get_request_site_address, get_datetime | from frappe.utils import get_request_site_address, get_datetime | ||||
from frappe.website.sitemap import get_pages, process_generators | |||||
from frappe.website.router import get_pages, process_generators | |||||
no_cache = 1 | no_cache = 1 | ||||
no_sitemap = 1 | no_sitemap = 1 | ||||
@@ -67,9 +67,7 @@ def update_permission(group, user, perm, value): | |||||
# send email | # send email | ||||
if perm=="admin" and int(value): | if perm=="admin" and int(value): | ||||
group_title = frappe.db.get_value("Website Route", pathname, "page_title") | |||||
subject = "You have been made Administrator of Group " + group_title | |||||
subject = "You have been made Administrator of Group " + doc.group_title | |||||
send(recipients=[user], | send(recipients=[user], | ||||
subject= subject, add_unsubscribe_link=False, | subject= subject, add_unsubscribe_link=False, | ||||
@@ -95,14 +93,11 @@ def add_website_group(group, new_group, public_read, public_write, group_type="F | |||||
if not get_access(doc, pathname).get("admin"): | if not get_access(doc, pathname).get("admin"): | ||||
raise frappe.PermissionError | raise frappe.PermissionError | ||||
parent_website_route = frappe.db.get_value("Website Route", | |||||
{"ref_doctype": "Website Group", "docname": group}) | |||||
frappe.get_doc({ | frappe.get_doc({ | ||||
"doctype": "Website Group", | "doctype": "Website Group", | ||||
"group_name": group + "-" + new_group, | "group_name": group + "-" + new_group, | ||||
"group_title": new_group, | "group_title": new_group, | ||||
"parent_website_route": parent_website_route, | |||||
"parent_website_group": group, | |||||
"group_type": group_type, | "group_type": group_type, | ||||
"public_read": int(public_read), | "public_read": int(public_read), | ||||
"public_write": int(public_write) | "public_write": int(public_write) | ||||
@@ -6,7 +6,7 @@ import frappe | |||||
from frappe.website.doctype.website_settings.website_settings import get_website_settings | from frappe.website.doctype.website_settings.website_settings import get_website_settings | ||||
from frappe.website.template import render_blocks | from frappe.website.template import render_blocks | ||||
from frappe.website.sitemap import get_sitemap_options | |||||
from frappe.website.router import get_route_info | |||||
from frappe.website.utils import can_cache | from frappe.website.utils import can_cache | ||||
from frappe.website.permissions import get_access | from frappe.website.permissions import get_access | ||||
@@ -25,7 +25,7 @@ def get_context(path): | |||||
context = frappe.cache().get_value(cache_key) | context = frappe.cache().get_value(cache_key) | ||||
if not context: | if not context: | ||||
context = get_sitemap_options(path) | |||||
context = get_route_info(path) | |||||
# permission may be required for rendering | # permission may be required for rendering | ||||
if context.doc and context.doc.doctype=="Website Group": | if context.doc and context.doc.doctype=="Website Group": | ||||
@@ -36,10 +36,6 @@ class BlogPost(WebsiteGenerator): | |||||
where ifnull(blogger,'')=tabBlogger.name) | where ifnull(blogger,'')=tabBlogger.name) | ||||
where name=%s""", (self.blogger,)) | where name=%s""", (self.blogger,)) | ||||
def get_category_route(self): | |||||
return frappe.db.get_value("Website Route", | |||||
{"ref_doctype": "Blog Category", "docname": self.blog_category}) | |||||
def on_update(self): | def on_update(self): | ||||
WebsiteGenerator.on_update(self) | WebsiteGenerator.on_update(self) | ||||
clear_cache("writers") | clear_cache("writers") | ||||
@@ -1,38 +1,29 @@ | |||||
from __future__ import unicode_literals | from __future__ import unicode_literals | ||||
import unittest | import unittest | ||||
import frappe | import frappe | ||||
from frappe.website.router import resolve_route | |||||
test_records = frappe.get_test_records('Web Page') | test_records = frappe.get_test_records('Web Page') | ||||
class TestWebPage(unittest.TestCase): | class TestWebPage(unittest.TestCase): | ||||
def setUp(self): | def setUp(self): | ||||
frappe.db.sql("delete from `tabWeb Page`") | frappe.db.sql("delete from `tabWeb Page`") | ||||
frappe.db.sql("delete from `tabWebsite Route` where ref_doctype='Web Page'") | |||||
for t in test_records: | for t in test_records: | ||||
frappe.get_doc(t).insert() | frappe.get_doc(t).insert() | ||||
def test_check_sitemap(self): | def test_check_sitemap(self): | ||||
self.assertEquals(frappe.db.get_value("Website Route", | |||||
{"ref_doctype":"Web Page", "docname": "test-web-page-1"}), "test-web-page-1") | |||||
self.assertEquals(frappe.db.get_value("Website Route", | |||||
{"ref_doctype":"Web Page", "docname": "test-web-page-2"}), "test-web-page-1/test-web-page-2") | |||||
self.assertEquals(frappe.db.get_value("Website Route", | |||||
{"ref_doctype":"Web Page", "docname": "test-web-page-3"}), "test-web-page-1/test-web-page-3") | |||||
resolve_route("test-web-page-1") | |||||
resolve_route("test-web-page-1/test-web-page-2") | |||||
resolve_route("test-web-page-1/test-web-page-3") | |||||
def test_check_rename(self): | def test_check_rename(self): | ||||
web_page = frappe.get_doc("Web Page", "test-web-page-1") | web_page = frappe.get_doc("Web Page", "test-web-page-1") | ||||
web_page.parent_website_route = "test-web-page-4" | web_page.parent_website_route = "test-web-page-4" | ||||
web_page.save() | web_page.save() | ||||
self.assertEquals(frappe.db.get_value("Website Route", | |||||
{"ref_doctype":"Web Page", "docname": "test-web-page-2"}), | |||||
"test-web-page-4/test-web-page-1/test-web-page-2") | |||||
resolve_route("test-web-page-4/test-web-page-1/test-web-page-2") | |||||
web_page.parent_website_route = "" | web_page.parent_website_route = "" | ||||
web_page.save() | web_page.save() | ||||
self.assertEquals(frappe.db.get_value("Website Route", | |||||
{"ref_doctype":"Web Page", "docname": "test-web-page-2"}), | |||||
"test-web-page-1/test-web-page-2") | |||||
resolve_route("test-web-page-1/test-web-page-2") |
@@ -5,6 +5,7 @@ from __future__ import unicode_literals | |||||
import frappe, re, os | import frappe, re, os | ||||
import requests, requests.exceptions | import requests, requests.exceptions | ||||
from frappe.website.website_generator import WebsiteGenerator | from frappe.website.website_generator import WebsiteGenerator | ||||
from frappe.website.router import resolve_route | |||||
from frappe.website.doctype.website_slideshow.website_slideshow import get_slideshow | from frappe.website.doctype.website_slideshow.website_slideshow import get_slideshow | ||||
from frappe.website.utils import find_first_image, get_comment_list | from frappe.website.utils import find_first_image, get_comment_list | ||||
from markdown2 import markdown | from markdown2 import markdown | ||||
@@ -114,7 +115,7 @@ def check_broken_links(): | |||||
link = link[1:] # remove leading / | link = link[1:] # remove leading / | ||||
link = link.split("#")[0] | link = link.split("#")[0] | ||||
if not frappe.db.exists("Website Route", link): | |||||
if not resolve_route(link): | |||||
print p.name + ":" + link | print p.name + ":" + link | ||||
cnt += 1 | cnt += 1 | ||||
@@ -1,139 +0,0 @@ | |||||
{ | |||||
"allow_rename": 1, | |||||
"autoname": "field:page_name", | |||||
"creation": "2013-11-18 15:38:40", | |||||
"docstatus": 0, | |||||
"doctype": "DocType", | |||||
"fields": [ | |||||
{ | |||||
"fieldname": "page_or_generator", | |||||
"fieldtype": "Select", | |||||
"label": "Page or Generator", | |||||
"options": "Page\nGenerator", | |||||
"permlevel": 0, | |||||
"read_only": 1 | |||||
}, | |||||
{ | |||||
"fieldname": "page_name", | |||||
"fieldtype": "Data", | |||||
"label": "Page Name", | |||||
"permlevel": 0, | |||||
"read_only": 1, | |||||
"reqd": 1 | |||||
}, | |||||
{ | |||||
"fieldname": "page_title", | |||||
"fieldtype": "Data", | |||||
"label": "Page Title", | |||||
"permlevel": 0, | |||||
"read_only": 1 | |||||
}, | |||||
{ | |||||
"fieldname": "ref_doctype", | |||||
"fieldtype": "Link", | |||||
"label": "Ref DocType", | |||||
"options": "DocType", | |||||
"permlevel": 0, | |||||
"reqd": 0 | |||||
}, | |||||
{ | |||||
"fieldname": "docname", | |||||
"fieldtype": "Dynamic Link", | |||||
"label": "Docname", | |||||
"options": "ref_doctype", | |||||
"permlevel": 0, | |||||
"read_only": 1 | |||||
}, | |||||
{ | |||||
"fieldname": "lastmod", | |||||
"fieldtype": "Data", | |||||
"label": "Lastmod", | |||||
"permlevel": 0 | |||||
}, | |||||
{ | |||||
"fieldname": "template", | |||||
"fieldtype": "Read Only", | |||||
"label": "Template", | |||||
"permlevel": 0 | |||||
}, | |||||
{ | |||||
"fieldname": "controller", | |||||
"fieldtype": "Read Only", | |||||
"label": "Controller", | |||||
"options": "", | |||||
"permlevel": 0 | |||||
}, | |||||
{ | |||||
"fieldname": "parent_website_route", | |||||
"fieldtype": "Link", | |||||
"in_list_view": 1, | |||||
"label": "Parent Website Sitemap", | |||||
"options": "Website Route", | |||||
"permlevel": 0, | |||||
"search_index": 1 | |||||
}, | |||||
{ | |||||
"fieldname": "lft", | |||||
"fieldtype": "Int", | |||||
"hidden": 1, | |||||
"label": "lft", | |||||
"permlevel": 0, | |||||
"read_only": 1, | |||||
"search_index": 1 | |||||
}, | |||||
{ | |||||
"fieldname": "rgt", | |||||
"fieldtype": "Int", | |||||
"hidden": 1, | |||||
"in_list_view": 0, | |||||
"label": "rgt", | |||||
"permlevel": 0, | |||||
"read_only": 1, | |||||
"search_index": 1 | |||||
}, | |||||
{ | |||||
"fieldname": "old_parent", | |||||
"fieldtype": "Data", | |||||
"hidden": 1, | |||||
"label": "Old Parent", | |||||
"permlevel": 0, | |||||
"read_only": 1 | |||||
}, | |||||
{ | |||||
"fieldname": "public_read", | |||||
"fieldtype": "Check", | |||||
"label": "Anyone Can Read", | |||||
"permlevel": 0 | |||||
}, | |||||
{ | |||||
"fieldname": "public_write", | |||||
"fieldtype": "Check", | |||||
"label": "Anyone Can Write", | |||||
"permlevel": 0 | |||||
}, | |||||
{ | |||||
"fieldname": "static_file_timestamp", | |||||
"fieldtype": "Data", | |||||
"label": "Static File Timestamp", | |||||
"permlevel": 0 | |||||
} | |||||
], | |||||
"idx": 1, | |||||
"modified": "2014-06-27 05:04:57.721756", | |||||
"modified_by": "Administrator", | |||||
"module": "Website", | |||||
"name": "Website Route", | |||||
"owner": "Administrator", | |||||
"permissions": [ | |||||
{ | |||||
"cancel": 0, | |||||
"create": 0, | |||||
"delete": 1, | |||||
"permlevel": 0, | |||||
"read": 1, | |||||
"report": 1, | |||||
"role": "Website Manager", | |||||
"write": 1 | |||||
} | |||||
] | |||||
} |
@@ -1,105 +0,0 @@ | |||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors | |||||
# MIT License. See license.txt | |||||
from __future__ import unicode_literals | |||||
import frappe | |||||
from frappe import _ | |||||
from frappe.utils.nestedset import NestedSet | |||||
sitemap_fields = ("page_name", "ref_doctype", "docname", "page_or_generator", "idx", | |||||
"lastmod", "parent_website_route", "public_read", "public_write", "page_title") | |||||
class WebsiteRoute(NestedSet): | |||||
nsm_parent_field = "parent_website_route" | |||||
def autoname(self): | |||||
self.name = self.get_url() | |||||
def get_url(self): | |||||
url = self.page_name | |||||
if self.parent_website_route: | |||||
url = self.parent_website_route + "/" + url | |||||
return url | |||||
def validate(self): | |||||
if not frappe.flags.in_sync_website: | |||||
self.make_private_if_parent_is_private() | |||||
def on_update(self): | |||||
if self.get_url() != self.name: | |||||
self.rename() | |||||
if not frappe.flags.in_sync_website: | |||||
NestedSet.on_update(self) | |||||
self.clear_cache() | |||||
def rename(self, new_page_name=None, new_parent_website_route=None): | |||||
self.old_name = self.name | |||||
self.old_parent_website_route = self.parent_website_route | |||||
# get new route | |||||
if new_page_name != None: | |||||
self.page_name = new_page_name | |||||
if new_parent_website_route != None: | |||||
self.parent_website_route = new_parent_website_route | |||||
self.name = self.get_url() | |||||
# update values (don't run triggers) | |||||
frappe.db.sql("""update `tabWebsite Route` set | |||||
name=%s, page_name=%s, parent_website_route=%s where name=%s""", | |||||
(self.name, self.page_name, self.parent_website_route, self.old_name)) | |||||
self.rename_links() | |||||
self.rename_descendants() | |||||
self.clear_cache(self.old_name) | |||||
self.clear_cache(self.old_parent_website_route) | |||||
self.clear_cache(self.parent_website_route) | |||||
def rename_links(self): | |||||
for doctype in frappe.db.sql_list("""select parent from tabDocField | |||||
where fieldtype='Link' | |||||
and fieldname='parent_website_route' | |||||
and options='Website Route' | |||||
and parent!='Website Route'"""): | |||||
for name in frappe.db.sql_list("""select name from `tab{}` | |||||
where parent_website_route=%s""".format(doctype), self.old_name): | |||||
frappe.db.set_value(doctype, name, "parent_website_route", self.name) | |||||
def rename_descendants(self): | |||||
# rename children | |||||
for name in frappe.db.sql_list("""select name from `tabWebsite Route` | |||||
where parent_website_route=%s""", self.old_name): | |||||
child = frappe.get_doc("Website Route", name) | |||||
child.parent_website_route = self.name | |||||
child.save() | |||||
def make_private_if_parent_is_private(self): | |||||
if self.parent_website_route: | |||||
parent_pubic_read = frappe.db.get_value("Website Route", self.parent_website_route, | |||||
"public_read") | |||||
if not parent_pubic_read: | |||||
self.public_read = self.public_write = 0 | |||||
def on_trash(self): | |||||
# remove website sitemap permissions | |||||
to_remove = frappe.db.sql_list("""select name from `tabWebsite Route Permission` | |||||
where website_route=%s""", (self.name,)) | |||||
frappe.delete_doc("Website Route Permission", to_remove, ignore_permissions=True) | |||||
self.clear_cache() | |||||
def clear_cache(self, name=None): | |||||
from frappe.website.render import clear_cache | |||||
if name: | |||||
clear_cache(name) | |||||
else: | |||||
if self.parent_website_route: | |||||
clear_cache(self.parent_website_route) | |||||
clear_cache(self.name) | |||||
def remove_sitemap(page_name=None, ref_doctype=None, docname=None): | |||||
if page_name: | |||||
frappe.delete_doc("Website Route", page_name, ignore_permissions=True, force=True) | |||||
elif ref_doctype and docname: | |||||
frappe.delete_doc("Website Route", frappe.db.sql_list("""select name from `tabWebsite Route` | |||||
where ref_doctype=%s and docname=%s""", (ref_doctype, docname)), ignore_permissions=True, force=True) |
@@ -7,6 +7,7 @@ from frappe import _ | |||||
from frappe.utils import get_request_site_address, encode | from frappe.utils import get_request_site_address, encode | ||||
from frappe.model.document import Document | from frappe.model.document import Document | ||||
from urllib import quote | from urllib import quote | ||||
from frappe.website.router import resolve_route | |||||
class WebsiteSettings(Document): | class WebsiteSettings(Document): | ||||
def validate(self): | def validate(self): | ||||
@@ -15,8 +16,7 @@ class WebsiteSettings(Document): | |||||
self.validate_home_page() | self.validate_home_page() | ||||
def validate_home_page(self): | def validate_home_page(self): | ||||
if self.home_page and \ | |||||
not frappe.db.get_value("Website Route", {"name": self.home_page}): | |||||
if self.home_page and not resolve_route(self.home_page): | |||||
frappe.throw(_("Invalid Home Page") + " (Standard pages - index, login, products, blog, about, contact)") | frappe.throw(_("Invalid Home Page") + " (Standard pages - index, login, products, blog, about, contact)") | ||||
def validate_top_bar_items(self): | def validate_top_bar_items(self): | ||||
@@ -1,71 +0,0 @@ | |||||
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors | |||||
// MIT License. See license.txt" | |||||
frappe.pages['sitemap-browser'].onload = function(wrapper) { | |||||
frappe.ui.make_app_page({ | |||||
parent: wrapper, | |||||
title: 'Sitemap Browser', | |||||
}); | |||||
wrapper.appframe.add_module_icon("Website") | |||||
wrapper.appframe.set_title_right('Refresh', function() { | |||||
frappe.website.sitemap.tree.rootnode.reload(); | |||||
}); | |||||
$(wrapper) | |||||
.find(".layout-side-section") | |||||
.html('<div class="text-muted">'+ | |||||
__('Click on a link to get options') + '</div>') | |||||
frappe.website.sitemap = new frappe.website.SitemapBrowser( | |||||
$(wrapper) | |||||
.find(".layout-main-section") | |||||
.css({ | |||||
"min-height": "300px", | |||||
"padding-bottom": "25px" | |||||
})); | |||||
} | |||||
frappe.provide("frappe.website"); | |||||
frappe.website.SitemapBrowser = Class.extend({ | |||||
init: function(parent) { | |||||
$(parent).empty(); | |||||
var me = this; | |||||
this.tree = new frappe.ui.Tree({ | |||||
parent: $(parent), | |||||
label: "Sitemap", | |||||
method: 'frappe.website.page.sitemap_browser.sitemap_browser.get_children', | |||||
toolbar: [ | |||||
{ | |||||
toggle_btn: true, | |||||
}, | |||||
{ | |||||
label: __("Open"), | |||||
click: function(node, btn) { | |||||
frappe.set_route("Form", node.data.ref_doctype, node.data.docname); | |||||
} | |||||
} | |||||
] | |||||
// drop: function(dragged_node, dropped_node, dragged_element, dropped_element) { | |||||
// frappe.website.sitemap.update_parent(dragged_node.label, dropped_node.label, function(r) { | |||||
// if(!r.exc) { | |||||
// dragged_element.remove(); | |||||
// dropped_node.reload(); | |||||
// } | |||||
// }); | |||||
// } | |||||
}); | |||||
this.tree.rootnode.$a | |||||
.data('node-data', {value: "Sitemap", expandable:1}) | |||||
.click(); | |||||
}, | |||||
selected_node: function() { | |||||
return this.tree.$w.find('.tree-link.selected'); | |||||
}, | |||||
open: function() { | |||||
var node = this.selected_node(); | |||||
frappe.set_route("Form", "Website Route", node.data("label")); | |||||
}, | |||||
}); |
@@ -1,23 +0,0 @@ | |||||
{ | |||||
"creation": "2014-02-18 10:47:22.000000", | |||||
"docstatus": 0, | |||||
"doctype": "Page", | |||||
"icon": "icon-sitemap", | |||||
"idx": 1, | |||||
"modified": "2014-02-18 10:47:22.000000", | |||||
"modified_by": "Administrator", | |||||
"module": "Website", | |||||
"name": "sitemap-browser", | |||||
"owner": "Administrator", | |||||
"page_name": "sitemap-browser", | |||||
"roles": [ | |||||
{ | |||||
"role": "Website Manager" | |||||
}, | |||||
{ | |||||
"role": "System Manager" | |||||
} | |||||
], | |||||
"standard": "Yes", | |||||
"title": "Sitemap Browser" | |||||
} |
@@ -1,75 +0,0 @@ | |||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors | |||||
# MIT License. See license.txt | |||||
from __future__ import unicode_literals | |||||
import frappe | |||||
from frappe import _ | |||||
from frappe.website.render import clear_cache | |||||
@frappe.whitelist() | |||||
def get_children(parent=None): | |||||
if not frappe.has_permission("Website Route"): | |||||
raise frappe.PermissionError | |||||
if parent=="Sitemap": | |||||
parent = "" | |||||
return frappe.db.sql("""select name as value, 1 as expandable, ref_doctype, docname | |||||
from `tabWebsite Route` where | |||||
ifnull(parent_website_route, '')=%s | |||||
order by ifnull(idx,0), name asc""", parent, as_dict=True) | |||||
@frappe.whitelist() | |||||
def move(name, up_or_down): | |||||
ret = None | |||||
if not frappe.has_permission("Website Route"): | |||||
raise frappe.PermissionError | |||||
sitemap = frappe.get_doc("Website Route", name) | |||||
if up_or_down=="up": | |||||
if sitemap.idx > 0: | |||||
prev = frappe.get_doc("Website Route", { | |||||
"parent_website_route": sitemap.parent_website_route, | |||||
"idx": sitemap.idx - 1 | |||||
}) | |||||
if prev.name: | |||||
prev.idx = prev.idx + 1 | |||||
prev.save() | |||||
sitemap.idx = sitemap.idx - 1 | |||||
sitemap.save() | |||||
ret = "ok" | |||||
else: | |||||
nexts = frappe.get_doc("Website Route", { | |||||
"parent_website_route": sitemap.parent_website_route, | |||||
"idx": sitemap.idx + 1 | |||||
}) | |||||
if nexts.name: | |||||
nexts.idx = nexts.idx - 1 | |||||
nexts.save() | |||||
sitemap.idx = sitemap.idx + 1 | |||||
sitemap.save() | |||||
ret = "ok" | |||||
clear_cache() | |||||
return ret | |||||
@frappe.whitelist() | |||||
def update_parent(name, new_parent): | |||||
if not frappe.has_permission("Website Route"): | |||||
raise frappe.PermissionError | |||||
sitemap = frappe.get_doc("Website Route", name) | |||||
if sitemap.ref_doctype: | |||||
generator = frappe.get_doc(sitemap.ref_doctype, sitemap.docname) | |||||
if not generator.meta.get_field("parent_website_route"): | |||||
frappe.throw(_("Not allowed to move")) | |||||
generator.parent_website_route = new_parent | |||||
generator.save() | |||||
else: | |||||
frappe.msgprint(_("Template Pages cannot be moved")) | |||||
clear_cache() |
@@ -10,7 +10,7 @@ from werkzeug.wrappers import Response | |||||
from frappe.website.context import get_context | from frappe.website.context import get_context | ||||
from frappe.website.utils import scrub_relative_urls, get_home_page, can_cache, delete_page_cache | from frappe.website.utils import scrub_relative_urls, get_home_page, can_cache, delete_page_cache | ||||
from frappe.website.permissions import clear_permissions | from frappe.website.permissions import clear_permissions | ||||
from frappe.website.sitemap import clear_sitemap | |||||
from frappe.website.router import clear_sitemap | |||||
class PageNotFoundError(Exception): pass | class PageNotFoundError(Exception): pass | ||||
@@ -162,8 +162,6 @@ def set_content_type(response, data, path): | |||||
return data | return data | ||||
def clear_cache(path=None): | def clear_cache(path=None): | ||||
cache = frappe.cache() | |||||
if path: | if path: | ||||
delete_page_cache(path) | delete_page_cache(path) | ||||
else: | else: | ||||
@@ -7,7 +7,7 @@ import frappe, os | |||||
from frappe.website.utils import can_cache, delete_page_cache | from frappe.website.utils import can_cache, delete_page_cache | ||||
from frappe.model.document import get_controller | from frappe.model.document import get_controller | ||||
def get_sitemap_options(path): | |||||
def get_route_info(path): | |||||
sitemap_options = None | sitemap_options = None | ||||
cache_key = "sitemap_options:{}".format(path) | cache_key = "sitemap_options:{}".format(path) | ||||
@@ -15,36 +15,36 @@ def get_sitemap_options(path): | |||||
sitemap_options = frappe.cache().get_value(cache_key) | sitemap_options = frappe.cache().get_value(cache_key) | ||||
if not sitemap_options: | if not sitemap_options: | ||||
sitemap_options = build_sitemap_options(path) | |||||
sitemap_options = build_route(path) | |||||
if can_cache(sitemap_options.no_cache): | if can_cache(sitemap_options.no_cache): | ||||
frappe.cache().set_value(cache_key, sitemap_options) | frappe.cache().set_value(cache_key, sitemap_options) | ||||
return sitemap_options | return sitemap_options | ||||
def build_sitemap_options(path): | |||||
sitemap_options = resolve_route(path) | |||||
if not sitemap_options: | |||||
def build_route(path): | |||||
context = resolve_route(path) | |||||
if not context: | |||||
raise frappe.DoesNotExistError | raise frappe.DoesNotExistError | ||||
if sitemap_options.controller: | |||||
module = frappe.get_module(sitemap_options.controller) | |||||
if context.controller: | |||||
module = frappe.get_module(context.controller) | |||||
# get sitemap config fields too | # get sitemap config fields too | ||||
for prop in ("base_template_path", "template", "no_cache", "no_sitemap", | for prop in ("base_template_path", "template", "no_cache", "no_sitemap", | ||||
"condition_field"): | "condition_field"): | ||||
if hasattr(module, prop): | if hasattr(module, prop): | ||||
sitemap_options[prop] = getattr(module, prop) | |||||
context[prop] = getattr(module, prop) | |||||
sitemap_options.doctype = sitemap_options.ref_doctype | |||||
sitemap_options.title = sitemap_options.page_title | |||||
sitemap_options.pathname = path | |||||
context.doctype = context.ref_doctype | |||||
context.title = context.page_title | |||||
context.pathname = path | |||||
# determine templates to be used | # determine templates to be used | ||||
if not sitemap_options.base_template_path: | |||||
if not context.base_template_path: | |||||
app_base = frappe.get_hooks("base_template") | app_base = frappe.get_hooks("base_template") | ||||
sitemap_options.base_template_path = app_base[0] if app_base else "templates/base.html" | |||||
context.base_template_path = app_base[0] if app_base else "templates/base.html" | |||||
return sitemap_options | |||||
return context | |||||
def resolve_route(path): | def resolve_route(path): | ||||
route = get_page_route(path) | route = get_page_route(path) | ||||
@@ -58,20 +58,28 @@ def get_page_route(path): | |||||
return found[0] if found else None | return found[0] if found else None | ||||
def get_generator_route(path): | def get_generator_route(path): | ||||
parts = path.rsplit("/", 1) | |||||
if len(parts)==1: | |||||
page_name = path | |||||
parent = None | |||||
else: | |||||
parent, page_name = parts | |||||
def get_route(doctype, condition_field, order_by): | def get_route(doctype, condition_field, order_by): | ||||
condition = [] | |||||
condition = ["page_name=%s"] | |||||
if condition_field: | if condition_field: | ||||
condition.append("ifnull({0}, 0)=1".format(condition_field)) | condition.append("ifnull({0}, 0)=1".format(condition_field)) | ||||
meta = frappe.get_meta(doctype) | |||||
if meta.get_field("parent_website_route"): | |||||
condition.append("""concat(ifnull(parent_website_route, ""), | |||||
if(ifnull(parent_website_route, "")="", "", "/"), page_name) = %s""") | |||||
else: | |||||
condition.append("page_name = %s") | |||||
values = (page_name,) | |||||
if parent: | |||||
meta = frappe.get_meta(doctype) | |||||
if meta.get_field("parent_website_route"): | |||||
condition.append("""parent_website_route=%s""") | |||||
values = (page_name, parent) | |||||
g = frappe.db.sql("""select name from `tab{0}` where {1} | g = frappe.db.sql("""select name from `tab{0}` where {1} | ||||
order by {2}""".format(doctype, " and ".join(condition), order_by), path) | |||||
order by {2}""".format(doctype, " and ".join(condition), order_by), values) | |||||
if g: | if g: | ||||
return frappe.get_doc(doctype, g[0][0]).get_website_route() | return frappe.get_doc(doctype, g[0][0]).get_website_route() | ||||
@@ -84,13 +92,15 @@ def clear_sitemap(): | |||||
def clear_generators(doctype, condition_field, order_by): | def clear_generators(doctype, condition_field, order_by): | ||||
meta = frappe.get_meta(doctype) | meta = frappe.get_meta(doctype) | ||||
query = "select page_name from `tab{0}`" | |||||
if meta.get_field("parent_website_route"): | if meta.get_field("parent_website_route"): | ||||
query = """select concat(ifnull(parent_website_route, ""), | |||||
if(ifnull(parent_website_route, "")="", "", "/"), page_name) from `tab{0}`""" | |||||
for route in frappe.db.sql_list(query.format(doctype)): | |||||
if route: | |||||
delete_page_cache(route) | |||||
query = "select page_name, parent_website_route from `tab{0}`" | |||||
else: | |||||
query = "select page_name, "" from `tab{0}`" | |||||
for r in frappe.db.sql(query.format(doctype)): | |||||
if r[0]: | |||||
delete_page_cache(((r[1] + "/") if r[1] else "") + r[0]) | |||||
process_generators(clear_generators) | process_generators(clear_generators) | ||||
@@ -5,7 +5,6 @@ from __future__ import unicode_literals | |||||
import frappe, os, time, sys | import frappe, os, time, sys | ||||
from frappe.utils import update_progress_bar | from frappe.utils import update_progress_bar | ||||
# from frappe.website.sitemap import get_route_children, get_next | |||||
def sync_statics(rebuild=False): | def sync_statics(rebuild=False): | ||||
s = sync() | s = sync() | ||||
@@ -9,7 +9,7 @@ from frappe.website.utils import cleanup_page_name, get_home_page | |||||
from frappe.website.render import clear_cache | from frappe.website.render import clear_cache | ||||
from frappe.utils import now | from frappe.utils import now | ||||
from frappe.modules import get_module_name | from frappe.modules import get_module_name | ||||
from frappe.website.sitemap import get_page_route | |||||
from frappe.website.router import get_page_route | |||||
class WebsiteGenerator(Document): | class WebsiteGenerator(Document): | ||||
page_title_field = "name" | page_title_field = "name" | ||||