Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
 
 

124 righe
3.7 KiB

  1. # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. from __future__ import unicode_literals
  4. import frappe
  5. from frappe.model.document import Document
  6. from frappe.model.naming import append_number_if_name_exists
  7. from frappe.website.utils import cleanup_page_name
  8. from frappe.utils import now
  9. from frappe.modules import get_module_name, load_doctype_module
  10. from frappe.website.doctype.website_route.website_route import remove_sitemap
  11. class WebsiteGenerator(Document):
  12. def autoname(self):
  13. self.name = self.get_page_name()
  14. append_number_if_name_exists(self)
  15. def onload(self):
  16. self.get("__onload").website_route = self.get_route()
  17. def get_parent_website_route(self):
  18. return self.get("parent_website_route", "")
  19. def on_update(self):
  20. self.update_sitemap()
  21. if getattr(self, "save_versions", False):
  22. frappe.add_version(self)
  23. def get_route(self):
  24. parent = self.get_parent_website_route()
  25. return ((parent + "/") if parent else "") + self.get_page_name()
  26. def get_route_docname(self, name=None):
  27. return frappe.db.get_value("Website Route",
  28. {"ref_doctype":self.doctype, "docname": name or self.name})
  29. def after_rename(self, olddn, newdn, merge):
  30. if self.is_condition_field_enabled():
  31. self.update_route(self.get_route_docname())
  32. def on_trash(self):
  33. remove_sitemap(ref_doctype=self.doctype, docname=self.name)
  34. def is_condition_field_enabled(self):
  35. self.controller_module = load_doctype_module(self.doctype)
  36. if hasattr(self.controller_module, "condition_field"):
  37. return self.get(self.controller_module.condition_field) and True or False
  38. else:
  39. return True
  40. def update_sitemap(self):
  41. # update route of all descendants
  42. route_docname = self.get_route_docname()
  43. if not self.is_condition_field_enabled():
  44. frappe.delete_doc("Website Route", route_docname, ignore_permissions=True)
  45. return
  46. if route_docname:
  47. self.update_route(route_docname)
  48. else:
  49. self.insert_route()
  50. def update_route(self, route_docname):
  51. route = frappe.get_doc("Website Route", route_docname)
  52. if self.get_route() != route_docname:
  53. route.rename(self.get_page_name(), self.get_parent_website_route())
  54. route.idx = self.idx
  55. route.page_title = self.get_page_title()
  56. self.update_permissions(route)
  57. route.save()
  58. def insert_route(self):
  59. if self.modified:
  60. # for sitemap.xml
  61. lastmod = frappe.utils.get_datetime(self.modified).strftime("%Y-%m-%d")
  62. else:
  63. lastmod = now()
  64. route = frappe.new_doc("Website Route")
  65. route.update({
  66. "page_or_generator": "Generator",
  67. "ref_doctype":self.doctype,
  68. "idx": self.idx,
  69. "docname": self.name,
  70. "page_name": self.get_page_name(),
  71. "controller": get_module_name(self.doctype, self.meta.module),
  72. "template": self.controller_module.template,
  73. "lastmod": lastmod,
  74. "parent_website_route": self.get_parent_website_route(),
  75. "page_title": self.get_page_title()
  76. })
  77. self.update_permissions(route)
  78. route.ignore_links = True
  79. route.insert(ignore_permissions=True)
  80. def update_permissions(self, route):
  81. if self.meta.get_field("public_read"):
  82. route.public_read = self.public_read
  83. route.public_write = self.public_write
  84. else:
  85. route.public_read = 1
  86. def get_page_name(self):
  87. return self.get_or_make_page_name()
  88. def get_page_name_field(self):
  89. return self.page_name_field if hasattr(self, "page_name_field") else "page_name"
  90. def get_or_make_page_name(self):
  91. page_name = self.get(self.get_page_name_field())
  92. if not page_name:
  93. page_name = cleanup_page_name(self.get_page_title())
  94. if self.is_new():
  95. self.set(self.get_page_name_field(), page_name)
  96. return page_name
  97. def get_page_title(self):
  98. return self.get("title") or (self.name.replace("-", " ").replace("_", " ").title())