You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

107 lines
3.3 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.controller import DocListController
  6. from frappe.website.utils import cleanup_page_name
  7. from frappe.website.doctype.website_sitemap.website_sitemap import add_to_sitemap, update_sitemap, remove_sitemap
  8. def call_website_generator(bean, method, *args, **kwargs):
  9. getattr(WebsiteGenerator(bean.doc, bean.doclist), method)(*args, **kwargs)
  10. class WebsiteGenerator(DocListController):
  11. def autoname(self):
  12. self.doc.name = cleanup_page_name(self.get_page_title())
  13. def set_page_name(self):
  14. """set page name based on parent page_name and title"""
  15. page_name = cleanup_page_name(self.get_page_title())
  16. if self.doc.is_new():
  17. self.doc.fields[self._website_config.page_name_field] = page_name
  18. else:
  19. frappe.conn.set(self.doc, self._website_config.page_name_field, page_name)
  20. def get_parent_website_sitemap(self):
  21. return self.doc.parent_website_sitemap
  22. def setup_generator(self):
  23. self._website_config = frappe.conn.get_values("Website Sitemap Config",
  24. {"ref_doctype": self.doc.doctype}, "*")[0]
  25. def on_update(self):
  26. self.update_sitemap()
  27. def after_rename(self, olddn, newdn, merge):
  28. frappe.conn.sql("""update `tabWebsite Sitemap`
  29. set docname=%s where ref_doctype=%s and docname=%s""", (newdn, self.doc.doctype, olddn))
  30. if merge:
  31. self.setup_generator()
  32. remove_sitemap(ref_doctype=self.doc.doctype, docname=olddn)
  33. def on_trash(self):
  34. self.setup_generator()
  35. remove_sitemap(ref_doctype=self.doc.doctype, docname=self.doc.name)
  36. def update_sitemap(self):
  37. self.setup_generator()
  38. if self._website_config.condition_field and \
  39. not self.doc.fields.get(self._website_config.condition_field):
  40. # condition field failed, remove and return!
  41. remove_sitemap(ref_doctype=self.doc.doctype, docname=self.doc.name)
  42. return
  43. self.add_or_update_sitemap()
  44. def add_or_update_sitemap(self):
  45. page_name = self.get_page_name()
  46. existing_site_map = frappe.conn.get_value("Website Sitemap", {"ref_doctype": self.doc.doctype,
  47. "docname": self.doc.name})
  48. opts = frappe._dict({
  49. "page_or_generator": "Generator",
  50. "ref_doctype":self.doc.doctype,
  51. "idx": self.doc.idx,
  52. "docname": self.doc.name,
  53. "page_name": page_name,
  54. "link_name": self._website_config.name,
  55. "lastmod": frappe.utils.get_datetime(self.doc.modified).strftime("%Y-%m-%d"),
  56. "parent_website_sitemap": self.get_parent_website_sitemap(),
  57. "page_title": self.get_page_title(),
  58. "public_read": 1 if not self._website_config.no_sidebar else 0
  59. })
  60. self.update_permissions(opts)
  61. if existing_site_map:
  62. idx = update_sitemap(existing_site_map, opts)
  63. else:
  64. idx = add_to_sitemap(opts)
  65. if idx and self.doc.idx != idx:
  66. self.update_value("idx", idx)
  67. def update_permissions(self, opts):
  68. if self.meta.get_field("public_read"):
  69. opts.public_read = self.doc.public_read
  70. opts.public_write = self.doc.public_write
  71. else:
  72. opts.public_read = 1
  73. def get_page_name(self):
  74. if not self._get_page_name():
  75. self.set_page_name()
  76. return self._get_page_name()
  77. def _get_page_name(self):
  78. return self.doc.fields.get(self._website_config.page_name_field)
  79. def get_page_title(self):
  80. return self.doc.title or (self.doc.name.replace("-", " ").replace("_", " ").title())