@@ -230,7 +230,7 @@ def setup_utilities(parser): | |||
# clear | |||
parser.add_argument("--clear_web", default=False, action="store_true", | |||
help="Clear website cache") | |||
parser.add_argument("--build_sitemap", default=False, action="store_true", | |||
parser.add_argument("--build_website", default=False, action="store_true", | |||
help="Build Website Route") | |||
parser.add_argument("--sync_statics", default=False, action="store_true", | |||
help="Sync files from templates/statics to Web Pages") | |||
@@ -352,7 +352,7 @@ def add_to_installed_apps(*apps): | |||
all_apps = frappe.get_all_apps(with_frappe=True) | |||
for each in apps: | |||
if each in all_apps: | |||
add_to_installed_apps(each, rebuild_sitemap=False) | |||
add_to_installed_apps(each, rebuild_website=False) | |||
frappe.destroy() | |||
@cmd | |||
@@ -402,10 +402,9 @@ def update(remote=None, branch=None, reload_gunicorn=False): | |||
subprocess.check_output("killall -HUP gunicorn".split()) | |||
@cmd | |||
def latest(rebuild_website_config=True, quiet=False): | |||
def latest(rebuild_website=True, quiet=False): | |||
import frappe.modules.patch_handler | |||
import frappe.model.sync | |||
from frappe.website import rebuild_config | |||
from frappe.utils.fixtures import sync_fixtures | |||
import frappe.translate | |||
from frappe.website import statics | |||
@@ -425,8 +424,8 @@ def latest(rebuild_website_config=True, quiet=False): | |||
sync.start() | |||
sync.start(rebuild=True) | |||
# build website config if any changes in templates etc. | |||
if rebuild_website_config: | |||
rebuild_config() | |||
if rebuild_website: | |||
build_website() | |||
frappe.translate.clear_cache() | |||
@@ -561,10 +560,10 @@ def clear_all_sessions(): | |||
frappe.destroy() | |||
@cmd | |||
def build_sitemap(): | |||
from frappe.website import rebuild_config | |||
def build_website(): | |||
import frappe.website.sync | |||
frappe.connect() | |||
rebuild_config() | |||
frappe.website.sync.sync() | |||
frappe.destroy() | |||
@cmd | |||
@@ -120,16 +120,16 @@ def install_app(name, verbose=False, set_as_patched=True): | |||
frappe.flags.in_install_app = False | |||
def add_to_installed_apps(app_name, rebuild_sitemap=True): | |||
def add_to_installed_apps(app_name, rebuild_website=True): | |||
installed_apps = frappe.get_installed_apps() | |||
if not app_name in installed_apps: | |||
installed_apps.append(app_name) | |||
frappe.db.set_global("installed_apps", json.dumps(installed_apps)) | |||
frappe.db.commit() | |||
if rebuild_sitemap: | |||
from frappe.website.doctype.website_template.website_template import rebuild_website_template | |||
rebuild_website_template() | |||
if rebuild_website: | |||
import frappe.website.sync | |||
frappe.website.sync.sync() | |||
frappe.clear_cache() | |||
@@ -41,3 +41,5 @@ frappe.patches.v4_0.fix_attach_field_file_url | |||
execute:frappe.reset_perms("User") #2014-06-13 | |||
execute:frappe.db.sql("""delete from `tabUserRole` where ifnull(parentfield, '')=''""") #2014-06-17 | |||
frappe.patches.v4_0.remove_user_owner_custom_field | |||
execute:frappe.delete_doc("DocType", "Website Template") | |||
execute:frappe.get_attr("frappe.website.sync.sync")() #2014-06-17 |
@@ -17,11 +17,11 @@ def execute(): | |||
frappe.reload_doc("website", "doctype", frappe.scrub(d)) | |||
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_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") | |||
for d in ("blog_category", "blog_post", "web_page", "website_route", "website_group", "post", "user_vote"): | |||
@@ -1,23 +1,24 @@ | |||
import frappe | |||
def execute(): | |||
from frappe.website.doctype.website_template.website_template import \ | |||
get_pages_and_generators, get_template_controller | |||
frappe.reload_doc("website", "doctype", "website_template") | |||
frappe.reload_doc("website", "doctype", "website_route") | |||
for app in frappe.get_installed_apps(): | |||
pages, generators = get_pages_and_generators(app) | |||
for g in generators: | |||
doctype = frappe.get_attr(get_template_controller(app, g["path"], g["fname"]) + ".doctype") | |||
module = frappe.db.get_value("DocType", doctype, "module") | |||
frappe.reload_doc(frappe.scrub(module), "doctype", frappe.scrub(doctype)) | |||
frappe.db.sql("""update `tabBlog Category` set `title`=`name` where ifnull(`title`, '')=''""") | |||
frappe.db.sql("""update `tabWebsite Route` set idx=null""") | |||
for doctype in ["Blog Category", "Blog Post", "Web Page", "Website Group"]: | |||
frappe.db.sql("""update `tab{}` set idx=null""".format(doctype)) | |||
from frappe.website.doctype.website_template.website_template import rebuild_website_template | |||
rebuild_website_template() | |||
pass | |||
# from frappe.website.doctype.website_template.website_template import \ | |||
# get_pages_and_generators, get_template_controller | |||
# | |||
# frappe.reload_doc("website", "doctype", "website_template") | |||
# frappe.reload_doc("website", "doctype", "website_route") | |||
# | |||
# for app in frappe.get_installed_apps(): | |||
# pages, generators = get_pages_and_generators(app) | |||
# for g in generators: | |||
# doctype = frappe.get_attr(get_template_controller(app, g["path"], g["fname"]) + ".doctype") | |||
# module = frappe.db.get_value("DocType", doctype, "module") | |||
# frappe.reload_doc(frappe.scrub(module), "doctype", frappe.scrub(doctype)) | |||
# | |||
# frappe.db.sql("""update `tabBlog Category` set `title`=`name` where ifnull(`title`, '')=''""") | |||
# frappe.db.sql("""update `tabWebsite Route` set idx=null""") | |||
# for doctype in ["Blog Category", "Blog Post", "Web Page", "Website Group"]: | |||
# frappe.db.sql("""update `tab{}` set idx=null""".format(doctype)) | |||
# | |||
# from frappe.website.doctype.website_template.website_template import rebuild_website_template | |||
# rebuild_website_template() |
@@ -6,9 +6,9 @@ from __future__ import unicode_literals | |||
import frappe | |||
def execute(): | |||
frappe.db.sql("""update `tabWebsite Route` ws set ref_doctype=(select wsc.ref_doctype | |||
from `tabWebsite Template` wsc where wsc.name=ws.website_template) | |||
where ifnull(page_or_generator, '')!='Page'""") | |||
# frappe.db.sql("""update `tabWebsite Route` ws set ref_doctype=(select wsc.ref_doctype | |||
# from `tabWebsite Template` wsc where wsc.name=ws.website_template) | |||
# where ifnull(page_or_generator, '')!='Page'""") | |||
frappe.reload_doc("website", "doctype", "website_settings") | |||
@@ -14,7 +14,6 @@ class WebsiteRoute(NestedSet): | |||
def autoname(self): | |||
self.name = self.get_url() | |||
print self.name | |||
def get_url(self): | |||
url = self.page_name | |||
@@ -1,130 +0,0 @@ | |||
{ | |||
"autoname": "field:link_name", | |||
"creation": "2013-11-18 15:35:00.000000", | |||
"docstatus": 0, | |||
"doctype": "DocType", | |||
"document_type": "System", | |||
"fields": [ | |||
{ | |||
"fieldname": "page_or_generator", | |||
"fieldtype": "Select", | |||
"label": "Page or Generator", | |||
"options": "Page\nGenerator", | |||
"permlevel": 0, | |||
"read_only": 1 | |||
}, | |||
{ | |||
"fieldname": "ref_doctype", | |||
"fieldtype": "Link", | |||
"label": "Ref DocType", | |||
"options": "DocType", | |||
"permlevel": 0, | |||
"read_only": 1 | |||
}, | |||
{ | |||
"fieldname": "link_name", | |||
"fieldtype": "Data", | |||
"label": "Link Name", | |||
"permlevel": 0, | |||
"read_only": 1 | |||
}, | |||
{ | |||
"fieldname": "page_title", | |||
"fieldtype": "Data", | |||
"label": "Page Title", | |||
"permlevel": 0 | |||
}, | |||
{ | |||
"fieldname": "base_template_path", | |||
"fieldtype": "Data", | |||
"label": "Base Template Path", | |||
"permlevel": 0, | |||
"read_only": 1 | |||
}, | |||
{ | |||
"fieldname": "template_path", | |||
"fieldtype": "Data", | |||
"label": "Template Path", | |||
"permlevel": 0, | |||
"read_only": 1 | |||
}, | |||
{ | |||
"fieldname": "controller", | |||
"fieldtype": "Data", | |||
"label": "Controller", | |||
"permlevel": 0, | |||
"read_only": 1 | |||
}, | |||
{ | |||
"fieldname": "lastmod", | |||
"fieldtype": "Data", | |||
"label": "Lastmod", | |||
"permlevel": 0 | |||
}, | |||
{ | |||
"fieldname": "no_cache", | |||
"fieldtype": "Check", | |||
"label": "No Cache", | |||
"permlevel": 0, | |||
"read_only": 1 | |||
}, | |||
{ | |||
"fieldname": "no_sitemap", | |||
"fieldtype": "Check", | |||
"label": "No Sitemap", | |||
"permlevel": 0, | |||
"read_only": 1 | |||
}, | |||
{ | |||
"fieldname": "no_sidebar", | |||
"fieldtype": "Check", | |||
"label": "No Sidebar", | |||
"permlevel": 0 | |||
}, | |||
{ | |||
"fieldname": "page_name_field", | |||
"fieldtype": "Data", | |||
"label": "Page Name Field", | |||
"permlevel": 0, | |||
"read_only": 1 | |||
}, | |||
{ | |||
"fieldname": "condition_field", | |||
"fieldtype": "Data", | |||
"label": "Condition Field", | |||
"permlevel": 0, | |||
"read_only": 1 | |||
}, | |||
{ | |||
"fieldname": "sort_by", | |||
"fieldtype": "Data", | |||
"label": "Sort By", | |||
"permlevel": 0 | |||
}, | |||
{ | |||
"fieldname": "sort_order", | |||
"fieldtype": "Data", | |||
"label": "Sort Order", | |||
"permlevel": 0 | |||
} | |||
], | |||
"idx": 1, | |||
"modified": "2014-02-24 12:47:44.000000", | |||
"modified_by": "Administrator", | |||
"module": "Website", | |||
"name": "Website Template", | |||
"owner": "Administrator", | |||
"permissions": [ | |||
{ | |||
"cancel": 0, | |||
"create": 0, | |||
"delete": 1, | |||
"export": 0, | |||
"permlevel": 0, | |||
"read": 1, | |||
"report": 1, | |||
"role": "System Manager", | |||
"write": 0 | |||
} | |||
] | |||
} |
@@ -1,141 +0,0 @@ | |||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors | |||
# MIT License. See license.txt | |||
# For license information, please see license.txt | |||
from __future__ import unicode_literals | |||
import frappe | |||
import frappe.utils | |||
import os | |||
from frappe import _ | |||
from frappe.website.doctype.website_route.website_route import add_to_sitemap, update_sitemap, cleanup_sitemap | |||
from frappe.utils.nestedset import rebuild_tree | |||
from frappe.model.document import Document | |||
class WebsiteTemplate(Document): | |||
def after_insert(self): | |||
if self.page_or_generator == "Page": | |||
website_route = frappe.db.get_value("Website Route", | |||
{"website_template": self.name, "page_or_generator": "Page"}) | |||
opts = self.as_dict() | |||
opts.update({"public_read": 1}) | |||
if website_route: | |||
update_sitemap(website_route, opts) | |||
else: | |||
add_to_sitemap(opts) | |||
else: | |||
condition = "" | |||
if self.condition_field: | |||
condition = " where ifnull(%s, 0)=1" % self.condition_field | |||
for name in frappe.db.sql_list("""select name from `tab{doctype}` | |||
{condition} order by idx asc, {sort_field} {sort_order}""".format( | |||
doctype = self.ref_doctype, | |||
condition = condition, | |||
sort_field = getattr(self, "sort_field", "name"), | |||
sort_order = getattr(self, "sort_order", "asc") | |||
)): | |||
doc = frappe.get_doc(self.ref_doctype, name) | |||
# regenerate route | |||
doc.run_method("on_update") | |||
def rebuild_website_template(): | |||
# TODO | |||
frappe.flags.in_rebuild_config = True | |||
frappe.db.sql("""delete from `tabWebsite Template`""") | |||
for app in frappe.get_installed_apps(): | |||
if app=="webnotes": app="frappe" | |||
build_website_template(app) | |||
cleanup_sitemap() | |||
frappe.flags.in_rebuild_config = False | |||
# enable nested set and rebuild | |||
rebuild_tree("Website Route", "parent_website_route") | |||
frappe.db.commit() | |||
def build_website_template(app): | |||
config = {"pages": {}, "generators":{}} | |||
pages, generators = get_pages_and_generators(app) | |||
for args in pages: | |||
add_website_template(**args) | |||
for args in generators: | |||
add_website_template(**args) | |||
frappe.db.commit() | |||
def get_pages_and_generators(app): | |||
pages = [] | |||
generators = [] | |||
app_path = frappe.get_app_path(app) | |||
for config_type in ("pages", "generators"): | |||
path = os.path.join(app_path, "templates", config_type) | |||
if os.path.exists(path): | |||
for fname in os.listdir(path): | |||
fname = frappe.utils.cstr(fname) | |||
if fname.split(".")[-1] in ("html", "xml", "js", "css"): | |||
if config_type=="pages": | |||
pages.append({"page_or_generator": "Page", "app": app, "path": path, | |||
"fname":fname, "app_path":app_path}) | |||
else: | |||
generators.append({"page_or_generator": "Generator", "app": app, "path": path, | |||
"fname":fname, "app_path":app_path}) | |||
return pages, generators | |||
def add_website_template(page_or_generator, app, path, fname, app_path): | |||
name = fname[:-5] if fname.endswith(".html") else fname | |||
wsc = frappe._dict({ | |||
"doctype": "Website Template", | |||
"page_or_generator": page_or_generator, | |||
"link_name": name, | |||
"template_path": os.path.relpath(os.path.join(path, fname), app_path), | |||
}) | |||
wsc.controller = get_template_controller(app, path, fname) | |||
if wsc.controller: | |||
# verbose print wsc.controller | |||
module = frappe.get_module(wsc.controller) | |||
wsc.no_cache = getattr(module, "no_cache", 0) | |||
wsc.no_sitemap = wsc.no_cache or getattr(module, "no_sitemap", 0) | |||
wsc.no_sidebar = wsc.no_sidebar or getattr(module, "no_sidebar", 0) | |||
wsc.ref_doctype = getattr(module, "doctype", None) | |||
wsc.page_name_field = getattr(module, "page_name_field", "page_name") | |||
wsc.condition_field = getattr(module, "condition_field", None) | |||
wsc.sort_by = getattr(module, "sort_by", "name") | |||
wsc.sort_order = getattr(module, "sort_order", "asc") | |||
wsc.base_template_path = getattr(module, "base_template_path", None) | |||
wsc.page_title = getattr(module, "page_title", _(name.title())) | |||
if frappe.db.exists("Website Template", wsc.link_name): | |||
# found by earlier app, override | |||
frappe.db.sql("""delete from `tabWebsite Template` where name=%s""", (wsc.link_name,)) | |||
frappe.get_doc(wsc).insert() | |||
return name | |||
def get_template_controller(app, path, fname): | |||
controller = None | |||
controller_name = fname.split(".")[0].replace("-", "_") + ".py" | |||
controller_path = os.path.join(path, controller_name) | |||
if os.path.exists(controller_path): | |||
controller = app + "." + os.path.relpath(controller_path[:-3], frappe.get_app_path(app)).replace(os.path.sep, ".") | |||
return controller | |||
@@ -1,24 +1,23 @@ | |||
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors | |||
// MIT License. See license.txt" | |||
frappe.pages['sitemap-browser'].onload = function(wrapper) { | |||
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() { | |||
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 to expand get options ') + | |||
__('Add') + ' / ' + __('Edit') + ' / '+ __('Remove') + '.</div>') | |||
.html('<div class="text-muted">'+ | |||
__('Click on a link to get options') + '</div>') | |||
frappe.website.sitemap = new frappe.website.SitemapBrowser( | |||
frappe.website.sitemap = new frappe.website.SitemapBrowser( | |||
$(wrapper) | |||
.find(".layout-main-section") | |||
.css({ | |||
@@ -34,31 +33,13 @@ frappe.website.SitemapBrowser = Class.extend({ | |||
$(parent).empty(); | |||
var me = this; | |||
this.tree = new frappe.ui.Tree({ | |||
parent: $(parent), | |||
parent: $(parent), | |||
label: "Sitemap", | |||
method: 'frappe.website.page.sitemap_browser.sitemap_browser.get_children', | |||
toolbar: [ | |||
{ | |||
toggle_btn: true, | |||
}, | |||
{ | |||
label: __("Update Parent"), | |||
click: function(node, btn) { | |||
me.update_parent(); | |||
} | |||
}, | |||
{ | |||
label: __("Up"), | |||
click: function(node, btn) { | |||
me.up_or_down("up"); | |||
} | |||
}, | |||
{ | |||
label: __("Down"), | |||
click: function(node, btn) { | |||
me.up_or_down("down"); | |||
} | |||
}, | |||
{ | |||
label: __("Open"), | |||
click: function(node, btn) { | |||
@@ -66,7 +47,7 @@ frappe.website.SitemapBrowser = Class.extend({ | |||
} | |||
} | |||
] | |||
// 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) { | |||
@@ -78,7 +59,7 @@ frappe.website.SitemapBrowser = Class.extend({ | |||
}); | |||
this.tree.rootnode.$a | |||
.data('node-data', {value: "Sitemap", expandable:1}) | |||
.click(); | |||
.click(); | |||
}, | |||
selected_node: function() { | |||
return this.tree.$w.find('.tree-link.selected'); | |||
@@ -87,67 +68,4 @@ frappe.website.SitemapBrowser = Class.extend({ | |||
var node = this.selected_node(); | |||
frappe.set_route("Form", "Website Route", node.data("label")); | |||
}, | |||
up_or_down: function(up_or_down) { | |||
var node = this.tree.get_selected_node(); | |||
frappe.call({ | |||
method: "frappe.website.page.sitemap_browser.sitemap_browser.move", | |||
args: { | |||
"name": node.label, | |||
"up_or_down": up_or_down | |||
}, | |||
callback: function(r) { | |||
if(r.message==="ok") { | |||
node.parent.insertBefore(up_or_down==="up" ? | |||
node.parent.prev() : node.parent.next().next()); | |||
//(node.parent_node || node).reload(); | |||
} | |||
} | |||
}); | |||
}, | |||
update_parent: function() { | |||
var me = this; | |||
if(!this.move_dialog) { | |||
this.move_dialog = new frappe.ui.Dialog({ | |||
title: __("Move"), | |||
fields: [ | |||
{ | |||
fieldtype: "Link", | |||
fieldname: "new_parent", | |||
label: "New Parent", | |||
reqd: 1, | |||
options: "Website Route" | |||
}, | |||
{ | |||
fieldtype: "Button", | |||
fieldname: "update", | |||
label: "Update", | |||
} | |||
] | |||
}); | |||
this.move_dialog.get_input("update").on("click", function() { | |||
var node = me.tree.get_selected_node(); | |||
var values = me.move_dialog.get_values(); | |||
if(!values) return; | |||
me._update_parent(node.label, values.new_parent, function(r) { | |||
me.move_dialog.hide(); | |||
(node.parent_node || node).reload(); | |||
}) | |||
}); | |||
} | |||
this.move_dialog.show(); | |||
this.move_dialog.get_input("new_parent").val(""); | |||
}, | |||
_update_parent: function(name, parent, callback) { | |||
frappe.call({ | |||
method: "frappe.website.page.sitemap_browser.sitemap_browser.update_parent", | |||
args: { | |||
"name": name, | |||
"new_parent": parent | |||
}, | |||
callback: function(r) { | |||
callback(r); | |||
} | |||
}); | |||
} | |||
}); | |||
}); |