# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors # MIT License. See license.txt from __future__ import unicode_literals import frappe from frappe.model.document import Document from frappe.model.naming import append_number_if_name_exists from frappe.website.utils import cleanup_page_name from frappe.utils import now from frappe.modules import get_module_name, load_doctype_module from frappe.website.doctype.website_route.website_route import remove_sitemap class WebsiteGenerator(Document): def autoname(self): self.name = self.get_page_name() append_number_if_name_exists(self) def onload(self): self.get("__onload").website_route = self.get_route() def get_parent_website_route(self): return self.get("parent_website_route", "") def on_update(self): self.update_sitemap() if getattr(self, "save_versions", False): frappe.add_version(self) def get_route(self): parent = self.get_parent_website_route() return ((parent + "/") if parent else "") + self.get_page_name() def get_route_docname(self, name=None): return frappe.db.get_value("Website Route", {"ref_doctype":self.doctype, "docname": name or self.name}) def after_rename(self, olddn, newdn, merge): if self.is_condition_field_enabled(): self.update_route(self.get_route_docname()) def on_trash(self): remove_sitemap(ref_doctype=self.doctype, docname=self.name) def is_condition_field_enabled(self): self.controller_module = load_doctype_module(self.doctype) if hasattr(self.controller_module, "condition_field"): return self.get(self.controller_module.condition_field) and True or False else: return True def update_sitemap(self): # update route of all descendants route_docname = self.get_route_docname() if not self.is_condition_field_enabled(): frappe.delete_doc("Website Route", route_docname, ignore_permissions=True) return if route_docname: self.update_route(route_docname) else: self.insert_route() def update_route(self, route_docname): route = frappe.get_doc("Website Route", route_docname) if self.get_route() != route_docname: route.rename(self.get_page_name(), self.get_parent_website_route()) route.idx = self.idx route.page_title = self.get_page_title() self.update_permissions(route) route.save() def insert_route(self): if self.modified: # for sitemap.xml lastmod = frappe.utils.get_datetime(self.modified).strftime("%Y-%m-%d") else: lastmod = now() route = frappe.new_doc("Website Route") route.update({ "page_or_generator": "Generator", "ref_doctype":self.doctype, "idx": self.idx, "docname": self.name, "page_name": self.get_page_name(), "controller": get_module_name(self.doctype, self.meta.module), "template": self.controller_module.template, "lastmod": lastmod, "parent_website_route": self.get_parent_website_route(), "page_title": self.get_page_title() }) self.update_permissions(route) route.ignore_links = True route.insert(ignore_permissions=True) def update_permissions(self, route): if self.meta.get_field("public_read"): route.public_read = self.public_read route.public_write = self.public_write else: route.public_read = 1 def get_page_name(self): return self.get_or_make_page_name() def get_page_name_field(self): return self.page_name_field if hasattr(self, "page_name_field") else "page_name" def get_or_make_page_name(self): page_name = self.get(self.get_page_name_field()) if not page_name: page_name = cleanup_page_name(self.get_page_title()) if self.is_new(): self.set(self.get_page_name_field(), page_name) return page_name def get_page_title(self): return self.get("title") or (self.name.replace("-", " ").replace("_", " ").title())