選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

website_group.py 3.4 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. import webnotes
  4. from webnotes.webutils import get_access, can_cache
  5. from webnotes.templates.website_group.post import clear_post_cache
  6. doctype = "Website Group"
  7. no_cache = 1
  8. def get_context(context):
  9. bean = webnotes.bean(context.ref_doctype, context.docname)
  10. group, view = guess_group_view(bean, context)
  11. try:
  12. if not has_access(group, view):
  13. raise webnotes.PermissionError
  14. group_context = get_group_context(group, view, bean)
  15. group_context["access"] = get_access(group)
  16. group_context.update(context)
  17. return group_context
  18. except webnotes.DoesNotExistError:
  19. return {
  20. "content": '<div class="alert alert-danger full-page">'
  21. 'The page you are looking for does not exist.</div>'
  22. }
  23. except webnotes.PermissionError:
  24. return {
  25. "content": '<div class="alert alert-danger full-page">'
  26. 'You are not permitted to view this page.</div>'
  27. }
  28. def get_group_context(group, view, bean):
  29. cache_key = "website_group_context:{}:{}".format(group, view)
  30. views = get_views(bean.doc.group_type)
  31. view = webnotes._dict(views.get(view))
  32. if can_cache(view.get("no_cache")):
  33. group_context = webnotes.cache().get_value(cache_key)
  34. if group_context:
  35. return group_context
  36. group_context = build_group_context(group, view, bean, views)
  37. if can_cache(view.get("no_cache")):
  38. webnotes.cache().set_value(cache_key, group_context)
  39. return group_context
  40. def build_group_context(group, view, bean, views):
  41. title = "{} - {}".format(bean.doc.group_title, view.get("label"))
  42. for name, opts in views.iteritems():
  43. opts["url"] = opts["url"].format(group=group, post="")
  44. group_context = webnotes._dict({
  45. "group": bean.doc.fields,
  46. "view": view,
  47. "views": (v[1] for v in sorted(views.iteritems(), key=lambda (k, v): v.get("idx"))),
  48. "title": title
  49. })
  50. handler = get_handler(bean.doc.group_type)
  51. if handler:
  52. group_context.update(handler.get_context(group_context))
  53. return group_context
  54. def guess_group_view(bean, context):
  55. group = context.docname
  56. view = webnotes.form_dict.view
  57. if not view:
  58. for v, opts in get_views(bean.doc.group_type).iteritems():
  59. if opts.get("default"):
  60. view = v
  61. break
  62. return group, view
  63. def get_handler(group_type):
  64. handler = webnotes.get_hooks("website_group_handler:{}".format(group_type))
  65. if handler:
  66. return webnotes.get_module(handler[0])
  67. def get_views(group_type):
  68. from copy import deepcopy
  69. handler = get_handler(group_type)
  70. if handler and hasattr(handler, "get_views"):
  71. return deepcopy(handler.get_views() or {})
  72. return {}
  73. def has_access(group, view):
  74. access = get_access(group)
  75. if view=="settings":
  76. return access.get("admin")
  77. elif view in ("add", "edit"):
  78. return access.get("write")
  79. else:
  80. return access.get("read")
  81. def clear_cache(page_name=None, website_group=None):
  82. if page_name or website_group:
  83. filters = {"page_name": page_name} if page_name else website_group
  84. website_group = webnotes.conn.get_value("Website Group", filters,
  85. ["page_name", "group_type"], as_dict=True)
  86. if not website_group:
  87. return
  88. website_groups = [website_group]
  89. else:
  90. clear_post_cache()
  91. website_groups = webnotes.conn.sql("""select page_name, group_type from `tabWebsite Group`""", as_dict=True)
  92. cache = webnotes.cache()
  93. for group in website_groups:
  94. for view in get_views(group.group_type):
  95. cache.delete_value("website_group_context:{}:{}".format(group.page_name, view))