您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

website_group.py 6.2 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. import webnotes
  4. from webnotes.website.permissions import get_access
  5. from webnotes.website.render import can_cache
  6. from webnotes.templates.website_group.forum import get_post_list_html
  7. doctype = "Website Group"
  8. no_cache = 1
  9. def get_context(context):
  10. group, view = guess_group_view(context)
  11. try:
  12. if not has_access(context.access, view):
  13. raise webnotes.PermissionError
  14. return get_group_context(group, view, context)
  15. except webnotes.DoesNotExistError:
  16. return {
  17. "content": '<div class="alert alert-danger full-page">'
  18. 'The page you are looking for does not exist.</div>'
  19. }
  20. except webnotes.PermissionError:
  21. return {
  22. "content": '<div class="alert alert-danger full-page">'
  23. 'You are not permitted to view this page.</div>'
  24. }
  25. def get_group_context(group, view, context):
  26. cache_key = "website_group_context:{}:{}".format(group, view)
  27. views = get_views(context.bean.doc.group_type)
  28. view = webnotes._dict(views.get(view))
  29. if can_cache(view.no_cache):
  30. group_context = webnotes.cache().get_value(cache_key)
  31. if group_context:
  32. return group_context
  33. group_context = build_group_context(group, view, views, context)
  34. if can_cache(view.get("no_cache")):
  35. webnotes.cache().set_value(cache_key, group_context)
  36. return group_context
  37. def build_group_context(group, view, views, context):
  38. title = "{} - {}".format(context.bean.doc.group_title, view.get("label"))
  39. group_context = webnotes._dict({
  40. "group": context.bean.doc.fields,
  41. "view": view,
  42. "views": [v[1] for v in sorted(views.iteritems(), key=lambda (k, v): v.get("idx"))],
  43. "title": title,
  44. "pathname": context.pathname
  45. })
  46. group_context.update(build_view_context(group_context))
  47. return group_context
  48. def build_view_context(context):
  49. from webnotes.templates.website_group.post import get_post_context
  50. if context.view.name in ("popular", "feed", "open", "closed", "upcoming", "past"):
  51. context.post_list_html = get_post_list_html(context.group.name, context.view.name)
  52. elif context.view.name == "edit":
  53. context.post = webnotes.doc("Post", webnotes.form_dict.name).fields
  54. if context.post.assigned_to:
  55. context.profile = webnotes.doc("Profile", context.post.assigned_to)
  56. elif context.view.name == "settings":
  57. context.profiles = webnotes.conn.sql("""select p.*, wsp.`read`, wsp.`write`, wsp.`admin`
  58. from `tabProfile` p, `tabWebsite Sitemap Permission` wsp
  59. where wsp.website_sitemap=%s and wsp.profile=p.name""", context.pathname, as_dict=True)
  60. elif context.view.name == "post":
  61. context.update(get_post_context(context))
  62. return context
  63. def guess_group_view(context):
  64. group = context.docname
  65. view = webnotes.form_dict.view or get_default_view(context.bean.doc.group_type)
  66. return group, view
  67. def get_default_view(group_type):
  68. for view, opts in get_views(group_type).iteritems():
  69. if opts.get("default"):
  70. return view
  71. def get_views(group_type=None):
  72. if group_type:
  73. group_views = webnotes._dict(views[group_type])
  74. else:
  75. group_views = {}
  76. for group_type in views:
  77. group_views.update(views[group_type].copy())
  78. group_views.update(common_views)
  79. if group_type == "Forum":
  80. group_views["post"]["upvote"] = True
  81. return group_views
  82. def has_access(access, view):
  83. if view=="settings":
  84. return access.get("admin")
  85. elif view in ("add", "edit"):
  86. return access.get("write")
  87. else:
  88. return access.get("read")
  89. def clear_cache(path=None, website_group=None):
  90. from webnotes.templates.website_group.post import clear_post_cache
  91. if path:
  92. website_groups = [webnotes.conn.get_value("Website Sitemap", path, "docname")]
  93. elif website_group:
  94. website_groups = [website_group]
  95. else:
  96. clear_post_cache()
  97. website_groups = webnotes.conn.sql_list("""select name from `tabWebsite Group`""")
  98. cache = webnotes.cache()
  99. all_views = get_views()
  100. for group in website_groups:
  101. for view in all_views:
  102. cache.delete_value("website_group_context:{}:{}".format(group, view))
  103. def clear_event_cache():
  104. for group in webnotes.conn.sql_list("""select name from `tabWebsite Group` where group_type='Event'"""):
  105. clear_unit_views(website_group=group)
  106. def clear_cache_on_bean_event(bean, method, *args, **kwargs):
  107. clear_cache(path=bean.doc.website_sitemap, website_group=bean.doc.website_group)
  108. def get_pathname(group):
  109. return webnotes.conn.get_value("Website Sitemap", {"ref_doctype": "Website Group",
  110. "docname": group})
  111. views = {
  112. "Forum": {
  113. "popular": {
  114. "name": "popular",
  115. "template_path": "templates/website_group/forum.html",
  116. "label": "Popular",
  117. "icon": "icon-heart",
  118. "default": True,
  119. "upvote": True,
  120. "idx": 1
  121. },
  122. "feed": {
  123. "name": "feed",
  124. "template_path": "templates/website_group/forum.html",
  125. "label": "Feed",
  126. "icon": "icon-rss",
  127. "upvote": True,
  128. "idx": 2
  129. }
  130. },
  131. "Tasks": {
  132. "open": {
  133. "name": "open",
  134. "template_path": "templates/website_group/forum.html",
  135. "label": "Open",
  136. "icon": "icon-inbox",
  137. "default": True,
  138. "upvote": True,
  139. "idx": 1
  140. },
  141. "closed": {
  142. "name": "closed",
  143. "template_path": "templates/website_group/forum.html",
  144. "label": "Closed",
  145. "icon": "icon-smile",
  146. "idx": 2
  147. }
  148. },
  149. "Events": {
  150. "upcoming": {
  151. "name": "upcoming",
  152. "template_path": "templates/website_group/forum.html",
  153. "label": "Upcoming",
  154. "icon": "icon-calendar",
  155. "default": True,
  156. "idx": 1
  157. },
  158. "past": {
  159. "name": "past",
  160. "template_path": "templates/website_group/forum.html",
  161. "label": "Past",
  162. "icon": "icon-time",
  163. "idx": 2
  164. }
  165. }
  166. }
  167. common_views = {
  168. "post": {
  169. "name": "post",
  170. "template_path": "templates/website_group/post.html",
  171. "label": "Post",
  172. "icon": "icon-comments",
  173. "hidden": True,
  174. "no_cache": True,
  175. "idx": 3
  176. },
  177. "edit": {
  178. "name": "edit",
  179. "template_path": "templates/website_group/edit_post.html",
  180. "label": "Edit Post",
  181. "icon": "icon-pencil",
  182. "hidden": True,
  183. "no_cache": True,
  184. "idx": 4
  185. },
  186. "add": {
  187. "name": "add",
  188. "template_path": "templates/website_group/edit_post.html",
  189. "label": "Add Post",
  190. "icon": "icon-plus",
  191. "hidden": True,
  192. "idx": 5
  193. },
  194. "settings": {
  195. "name": "settings",
  196. "template_path": "templates/website_group/settings.html",
  197. "label": "Settings",
  198. "icon": "icon-cog",
  199. "hidden": True,
  200. "idx": 6
  201. }
  202. }