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.

web_page.py 2.9 KiB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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 webnotes
  5. from webnotes.webutils import render_blocks
  6. from webnotes.website.doctype.website_slideshow.website_slideshow import get_slideshow
  7. doctype = "Web Page"
  8. condition_field = "published"
  9. def get_context(context):
  10. web_page = webnotes.bean(context.ref_doctype, context.docname)
  11. if web_page.doc.slideshow:
  12. web_page.doc.fields.update(get_slideshow(web_page))
  13. web_page.doc.meta_description = web_page.doc.description
  14. web_page.doc.breadcrumbs = get_breadcrumbs(web_page)
  15. web_page.doc.toc_list = get_toc_list(web_page)
  16. # parent, child, next sibling links
  17. web_page.doc.links = get_navigation_links(web_page)
  18. if web_page.doc.enable_comments:
  19. web_page.doc.comment_list = webnotes.conn.sql("""select
  20. comment, comment_by_fullname, creation
  21. from `tabComment` where comment_doctype="Web Page"
  22. and comment_docname=%s order by creation""", web_page.doc.name, as_dict=1) or []
  23. web_page.doc.fields.update({
  24. "style": web_page.doc.css or "",
  25. "script": web_page.doc.javascript or ""
  26. })
  27. web_page.doc.fields.update(context)
  28. return render_blocks(web_page.doc.fields)
  29. def get_breadcrumbs(web_page):
  30. breadcrumbs = []
  31. def add_parent_of(web_page):
  32. parent = webnotes.conn.sql("""select name, page_name, title from `tabWeb Page`
  33. where exists (select parent from `tabTable of Contents`
  34. where `tabTable of Contents`.parent=`tabWeb Page`.name
  35. and web_page=%s)""", web_page, as_dict=True)
  36. if parent and parent[0]:
  37. parent = parent[0]
  38. add_parent_of(parent.name)
  39. breadcrumbs.append(parent)
  40. add_parent_of(web_page.doc.name)
  41. return breadcrumbs
  42. def get_toc_list(web_page):
  43. toc_list = web_page.doclist.get({"parentfield": "toc"})
  44. if not toc_list: return []
  45. out = webnotes.conn.sql("""select name, page_name, title
  46. from `tabWeb Page` where name in (%s)""" % \
  47. (", ".join(["%s"]*len(toc_list))),
  48. tuple([d.web_page for d in toc_list]),
  49. as_dict=True)
  50. toc_idx = dict(((toc.web_page, toc.idx) for toc in toc_list))
  51. return sorted(out, key=lambda x: toc_idx.get(x.name))
  52. def get_navigation_links(web_page):
  53. links = {}
  54. if web_page.doc.toc_list:
  55. links["child"] = web_page.doc.toc_list[0]
  56. if web_page.doc.breadcrumbs:
  57. if web_page.doc.breadcrumbs[-1]:
  58. links["parent"] = web_page.doc.breadcrumbs[-1]
  59. def set_next(current, parent, breadcrumbs):
  60. web_page = webnotes.get_obj("Web Page", parent)
  61. toc_list = web_page.get_toc_list()
  62. for i, toc in enumerate(toc_list):
  63. if toc.name == current and ((i+1)<len(toc_list)):
  64. links["next"] = toc_list[i+1]
  65. break
  66. if not links.get("next") and breadcrumbs:
  67. set_next(parent, breadcrumbs[-1].name, breadcrumbs[:-1])
  68. set_next(web_page.doc.name, web_page.doc.breadcrumbs[-1].name, web_page.doc.breadcrumbs[:-1])
  69. return links