Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

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