Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

website_group.py 2.7 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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, render_blocks, can_cache
  5. doctype = "Website Group"
  6. no_cache = 1
  7. def get_context(context):
  8. bean = webnotes.bean(context.ref_doctype, context.docname)
  9. group, view = guess_group_view(bean, context)
  10. try:
  11. if not has_access(group, view):
  12. raise webnotes.PermissionError
  13. group_context = get_group_context(group, view, bean)
  14. group_context["access"] = get_access(group)
  15. group_context.update(context)
  16. return render_blocks(group_context)
  17. except webnotes.DoesNotExistError:
  18. return {
  19. "content": '<div class="alert alert-danger full-page">'
  20. 'The page you are looking for does not exist.</div>'
  21. }
  22. except webnotes.PermissionError:
  23. return {
  24. "content": '<div class="alert alert-danger full-page">'
  25. 'You are not permitted to view this page.</div>'
  26. }
  27. def get_group_context(group, view, bean):
  28. cache_key = "website_group_context:{}:{}".format(group, view)
  29. views = get_views(bean.doc.group_type)
  30. view = webnotes._dict(views.get(view))
  31. if can_cache(view.get("no_cache")):
  32. group_context = webnotes.cache().get_value(cache_key)
  33. if group_context:
  34. return group_context
  35. group_context = build_group_context(group, view, bean, views)
  36. if can_cache(view.get("no_cache")):
  37. webnotes.cache().set_value(cache_key, group_context)
  38. return group_context
  39. def build_group_context(group, view, bean, views):
  40. title = "{} - {}".format(bean.doc.group_title, view.get("label"))
  41. for name, opts in views.iteritems():
  42. opts["url"] = opts["url"].format(group=group, post="")
  43. group_context = webnotes._dict({
  44. "group": bean.doc.fields,
  45. "view": view,
  46. "views": (v[1] for v in sorted(views.iteritems(), key=lambda (k, v): v.get("idx"))),
  47. "title": title
  48. })
  49. handler = get_handler(bean.doc.group_type)
  50. if handler:
  51. group_context.update(handler.get_context(group_context))
  52. return group_context
  53. def guess_group_view(bean, context):
  54. group = context.docname
  55. view = webnotes.form_dict.view
  56. if not view:
  57. for v, opts in get_views(bean.doc.group_type).iteritems():
  58. if opts.get("default"):
  59. view = v
  60. break
  61. return group, view
  62. def get_handler(group_type):
  63. handler = webnotes.get_hooks("website_group_handler:{}".format(group_type))
  64. if handler:
  65. return webnotes.get_module(handler[0])
  66. def get_views(group_type):
  67. from copy import deepcopy
  68. handler = get_handler(group_type)
  69. if handler and hasattr(handler, "get_views"):
  70. return deepcopy(handler.get_views() or {})
  71. return {}
  72. def has_access(group, view):
  73. access = get_access(group)
  74. if view=="settings":
  75. return access.get("admin")
  76. elif view in ("add", "edit"):
  77. return access.get("write")
  78. else:
  79. return access.get("read")