views.py 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. # -*- coding: utf-8 -*-
  2. """
  3. flaskbb.admin.views
  4. ~~~~~~~~~~~~~~~~~~~
  5. This module handles the admin views.
  6. :copyright: (c) 2014 by the FlaskBB Team.
  7. :license: BSD, see LICENSE for more details.
  8. """
  9. import sys
  10. from flask import (Blueprint, current_app, request, redirect, url_for, flash,
  11. __version__ as flask_version)
  12. from flaskbb import __version__ as flaskbb_version
  13. from flaskbb.utils.helpers import render_template
  14. from flaskbb.utils.decorators import admin_required
  15. from flaskbb.extensions import db
  16. from flaskbb.user.models import User, Group
  17. from flaskbb.forum.models import Post, Topic, Forum, Category
  18. from flaskbb.admin.forms import (AddUserForm, EditUserForm, AddGroupForm,
  19. EditGroupForm, EditForumForm, AddForumForm,
  20. CategoryForm)
  21. admin = Blueprint("admin", __name__)
  22. @admin.route("/")
  23. @admin_required
  24. def overview():
  25. python_version = "%s.%s" % (sys.version_info[0], sys.version_info[1])
  26. user_count = User.query.count()
  27. topic_count = Topic.query.count()
  28. post_count = Post.query.count()
  29. return render_template("admin/overview.html",
  30. python_version=python_version,
  31. flask_version=flask_version,
  32. flaskbb_version=flaskbb_version,
  33. user_count=user_count,
  34. topic_count=topic_count,
  35. post_count=post_count)
  36. @admin.route("/users")
  37. @admin_required
  38. def users():
  39. page = request.args.get("page", 1, type=int)
  40. users = User.query.\
  41. paginate(page, current_app.config['USERS_PER_PAGE'], False)
  42. return render_template("admin/users.html", users=users)
  43. @admin.route("/groups")
  44. @admin_required
  45. def groups():
  46. page = request.args.get("page", 1, type=int)
  47. groups = Group.query.\
  48. paginate(page, current_app.config['USERS_PER_PAGE'], False)
  49. return render_template("admin/groups.html", groups=groups)
  50. @admin.route("/forums")
  51. @admin_required
  52. def forums():
  53. categories = Category.query.order_by(Category.position.asc()).all()
  54. return render_template("admin/forums.html", categories=categories)
  55. @admin.route("/users/<int:user_id>/edit", methods=["GET", "POST"])
  56. @admin_required
  57. def edit_user(user_id):
  58. user = User.query.filter_by(id=user_id).first_or_404()
  59. secondary_group_query = Group.query.filter(
  60. db.not_(Group.id == user.primary_group_id),
  61. db.not_(Group.banned == True),
  62. db.not_(Group.guest == True))
  63. form = EditUserForm(user)
  64. form.secondary_groups.query = secondary_group_query
  65. if form.validate_on_submit():
  66. user.username = form.username.data
  67. user.email = form.email.data
  68. user.birthday = form.birthday.data
  69. user.gender = form.gender.data
  70. user.website = form.website.data
  71. user.location = form.location.data
  72. user.signature = form.signature.data
  73. user.avatar = form.avatar.data
  74. user.notes = form.notes.data
  75. user.primary_group_id = form.primary_group.data.id
  76. # Don't override the password
  77. if form.password.data:
  78. user.password = form.password.data
  79. user.save(groups=form.secondary_groups.data)
  80. flash("User successfully edited", "success")
  81. return redirect(url_for("admin.edit_user", user_id=user.id))
  82. else:
  83. form.username.data = user.username
  84. form.email.data = user.email
  85. form.birthday.data = user.birthday
  86. form.gender.data = user.gender
  87. form.website.data = user.website
  88. form.location.data = user.location
  89. form.signature.data = user.signature
  90. form.avatar.data = user.avatar
  91. form.notes.data = user.notes
  92. form.primary_group.data = user.primary_group
  93. form.secondary_groups.data = user.secondary_groups
  94. return render_template("admin/user_form.html", form=form,
  95. title="Edit User")
  96. @admin.route("/users/<int:user_id>/delete")
  97. @admin_required
  98. def delete_user(user_id):
  99. user = User.query.filter_by(id=user_id).first_or_404()
  100. user.delete()
  101. flash("User successfully deleted", "success")
  102. return redirect(url_for("admin.users"))
  103. @admin.route("/users/add", methods=["GET", "POST"])
  104. @admin_required
  105. def add_user():
  106. form = AddUserForm()
  107. if form.validate_on_submit():
  108. form.save()
  109. flash("User successfully added.", "success")
  110. return redirect(url_for("admin.users"))
  111. return render_template("admin/user_form.html", form=form,
  112. title="Add User")
  113. @admin.route("/groups/<int:group_id>/edit", methods=["GET", "POST"])
  114. @admin_required
  115. def edit_group(group_id):
  116. group = Group.query.filter_by(id=group_id).first_or_404()
  117. form = EditGroupForm(group)
  118. if form.validate_on_submit():
  119. form.populate_obj(group)
  120. group.save()
  121. flash("Group successfully edited.", "success")
  122. return redirect(url_for("admin.groups", group_id=group.id))
  123. else:
  124. form.name.data = group.name
  125. form.description.data = group.description
  126. form.admin.data = group.admin
  127. form.super_mod.data = group.super_mod
  128. form.mod.data = group.mod
  129. form.guest.data = group.guest
  130. form.banned.data = group.banned
  131. form.editpost.data = group.editpost
  132. form.deletepost.data = group.deletepost
  133. form.deletetopic.data = group.deletetopic
  134. form.posttopic.data = group.posttopic
  135. form.postreply.data = group.postreply
  136. return render_template("admin/group_form.html", form=form,
  137. title="Edit Group")
  138. @admin.route("/groups/<int:group_id>/delete")
  139. @admin_required
  140. def delete_group(group_id):
  141. group = Group.query.filter_by(id=group_id).first_or_404()
  142. group.delete()
  143. flash("Group successfully deleted.", "success")
  144. return redirect(url_for("admin.groups"))
  145. @admin.route("/groups/add", methods=["GET", "POST"])
  146. @admin_required
  147. def add_group():
  148. form = AddGroupForm()
  149. if form.validate_on_submit():
  150. form.save()
  151. flash("Group successfully added.", "success")
  152. return redirect(url_for("admin.groups"))
  153. return render_template("admin/group_form.html", form=form,
  154. title="Add Group")
  155. @admin.route("/forums/<int:forum_id>/edit", methods=["GET", "POST"])
  156. @admin_required
  157. def edit_forum(forum_id):
  158. forum = Forum.query.filter_by(id=forum_id).first_or_404()
  159. form = EditForumForm(forum)
  160. if form.validate_on_submit():
  161. form.populate_obj(forum)
  162. forum.save(moderators=form.moderators.data)
  163. flash("Forum successfully edited.", "success")
  164. return redirect(url_for("admin.edit_forum", forum_id=forum.id))
  165. else:
  166. form.title.data = forum.title
  167. form.description.data = forum.description
  168. form.position.data = forum.position
  169. form.category.data = forum.category
  170. form.external.data = forum.external
  171. form.locked.data = forum.locked
  172. form.show_moderators.data = forum.show_moderators
  173. if forum.moderators:
  174. form.moderators.data = ",".join([user.username
  175. for user in forum.moderators])
  176. else:
  177. form.moderators.data = None
  178. return render_template("admin/forum_form.html", form=form,
  179. title="Edit Forum")
  180. @admin.route("/forums/<int:forum_id>/delete")
  181. @admin_required
  182. def delete_forum(forum_id):
  183. forum = Forum.query.filter_by(id=forum_id).first_or_404()
  184. involved_users = User.query.filter(Topic.forum_id == forum.id,
  185. Post.user_id == User.id).all()
  186. forum.delete(involved_users)
  187. flash("Forum successfully deleted.", "success")
  188. return redirect(url_for("admin.forums"))
  189. @admin.route("/forums/add", methods=["GET", "POST"])
  190. @admin.route("/forums/<int:category_id>/add", methods=["GET", "POST"])
  191. @admin_required
  192. def add_forum(category_id=None):
  193. form = AddForumForm()
  194. if form.validate_on_submit():
  195. form.save()
  196. flash("Forum successfully added.", "success")
  197. return redirect(url_for("admin.forums"))
  198. else:
  199. if category_id:
  200. category = Category.query.filter_by(id=category_id).first()
  201. form.category.data = category
  202. return render_template("admin/forum_form.html", form=form,
  203. title="Add Forum")
  204. @admin.route("/category/add", methods=["GET", "POST"])
  205. def add_category():
  206. form = CategoryForm()
  207. if form.validate_on_submit():
  208. form.save()
  209. flash("Category successfully created.", "success")
  210. return redirect(url_for("admin.forums"))
  211. return render_template("admin/category_form.html", form=form,
  212. title="Add Category")
  213. @admin.route("/category/<int:category_id>/edit", methods=["GET", "POST"])
  214. def edit_category(category_id):
  215. category = Category.query.filter_by(id=category_id).first_or_404()
  216. form = CategoryForm()
  217. if form.validate_on_submit():
  218. form.populate_obj(category)
  219. category.save()
  220. else:
  221. form.title.data = category.title
  222. form.description.data = category.description
  223. form.position.data = category.position
  224. return render_template("admin/category_form.html", form=form,
  225. title="Edit Category")
  226. @admin.route("/category/<int:category_id>/delete", methods=["GET", "POST"])
  227. def delete_category(category_id):
  228. category = Category.query.filter_by(id=category_id).first_or_404()
  229. involved_users = User.query.filter(Forum.category_id == category.id,
  230. Topic.forum_id == Forum.id,
  231. Post.user_id == User.id).all()
  232. category.delete(involved_users)
  233. flash("Category with all associated forums deleted.", "success")
  234. return redirect(url_for("admin.forums"))