views.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  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 datetime import datetime
  11. from flask import (Blueprint, current_app, request, redirect, url_for, flash,
  12. __version__ as flask_version)
  13. from flask.ext.login import current_user
  14. from flask.ext.plugins import get_plugins_list, get_plugin
  15. from flaskbb import __version__ as flaskbb_version
  16. from flaskbb.forum.forms import UserSearchForm
  17. from flaskbb.utils.helpers import render_template
  18. from flaskbb.utils.decorators import admin_required
  19. from flaskbb.extensions import db
  20. from flaskbb.user.models import User, Group
  21. from flaskbb.forum.models import Post, Topic, Forum, Category, Report
  22. from flaskbb.admin.forms import (AddUserForm, EditUserForm, AddGroupForm,
  23. EditGroupForm, EditForumForm, AddForumForm,
  24. CategoryForm)
  25. admin = Blueprint("admin", __name__)
  26. @admin.route("/")
  27. @admin_required
  28. def overview():
  29. python_version = "%s.%s" % (sys.version_info[0], sys.version_info[1])
  30. user_count = User.query.count()
  31. topic_count = Topic.query.count()
  32. post_count = Post.query.count()
  33. return render_template("admin/overview.html",
  34. python_version=python_version,
  35. flask_version=flask_version,
  36. flaskbb_version=flaskbb_version,
  37. user_count=user_count,
  38. topic_count=topic_count,
  39. post_count=post_count)
  40. @admin.route("/settings", methods=["GET", "POST"])
  41. @admin_required
  42. def settings():
  43. return render_template("admin/settings.html", themes=[])
  44. @admin.route("/users", methods=['GET', 'POST'])
  45. @admin_required
  46. def users():
  47. page = request.args.get("page", 1, type=int)
  48. search_form = UserSearchForm()
  49. if search_form.validate():
  50. users = search_form.get_results().\
  51. paginate(page, current_app.config['USERS_PER_PAGE'], False)
  52. return render_template("admin/users.html", users=users,
  53. search_form=search_form)
  54. users = User.query. \
  55. paginate(page, current_app.config['USERS_PER_PAGE'], False)
  56. return render_template("admin/users.html", users=users,
  57. search_form=search_form)
  58. @admin.route("/groups")
  59. @admin_required
  60. def groups():
  61. page = request.args.get("page", 1, type=int)
  62. groups = Group.query.\
  63. paginate(page, current_app.config['USERS_PER_PAGE'], False)
  64. return render_template("admin/groups.html", groups=groups)
  65. @admin.route("/forums")
  66. @admin_required
  67. def forums():
  68. categories = Category.query.order_by(Category.position.asc()).all()
  69. return render_template("admin/forums.html", categories=categories)
  70. @admin.route("/reports")
  71. @admin_required
  72. def reports():
  73. page = request.args.get("page", 1, type=int)
  74. reports = Report.query.\
  75. order_by(Report.id.asc()).\
  76. paginate(page, current_app.config['USERS_PER_PAGE'], False)
  77. return render_template("admin/reports.html", reports=reports)
  78. @admin.route("/plugins")
  79. @admin_required
  80. def plugins():
  81. return render_template("admin/plugins.html", plugins=get_plugins_list())
  82. @admin.route("/plugins/enable/<plugin>")
  83. def enable_plugin(plugin):
  84. plugin = get_plugin(plugin)
  85. current_app.plugin_manager.enable_plugins([plugin])
  86. return redirect(url_for("admin.plugins"))
  87. @admin.route("/plugins/disable/<plugin>")
  88. def disable_plugin(plugin):
  89. plugin = get_plugin(plugin)
  90. current_app.plugin_manager.disable_plugins([plugin])
  91. return redirect(url_for("admin.plugins"))
  92. @admin.route("/reports/unread")
  93. @admin_required
  94. def unread_reports():
  95. page = request.args.get("page", 1, type=int)
  96. reports = Report.query.\
  97. filter(Report.zapped == None).\
  98. order_by(Report.id.desc()).\
  99. paginate(page, current_app.config['USERS_PER_PAGE'], False)
  100. return render_template("admin/unread_reports.html", reports=reports)
  101. @admin.route("/reports/<int:report_id>/markread")
  102. @admin.route("/reports/markread")
  103. @admin_required
  104. def report_markread(report_id=None):
  105. # mark single report as read
  106. if report_id:
  107. report = Report.query.filter_by(id=report_id).first_or_404()
  108. if report.zapped:
  109. flash("Report %s is already marked as read" % report.id, "success")
  110. return redirect(url_for("admin.reports"))
  111. report.zapped_by = current_user.id
  112. report.zapped = datetime.utcnow()
  113. report.save()
  114. flash("Report %s marked as read" % report.id, "success")
  115. return redirect(url_for("admin.reports"))
  116. # mark all as read
  117. reports = Report.query.filter(Report.zapped == None).all()
  118. report_list = []
  119. for report in reports:
  120. report.zapped_by = current_user.id
  121. report.zapped = datetime.utcnow()
  122. report_list.append(report)
  123. db.session.add_all(report_list)
  124. db.session.commit()
  125. flash("All reports were marked as read", "success")
  126. return redirect(url_for("admin.reports"))
  127. @admin.route("/users/<int:user_id>/edit", methods=["GET", "POST"])
  128. @admin_required
  129. def edit_user(user_id):
  130. user = User.query.filter_by(id=user_id).first_or_404()
  131. secondary_group_query = Group.query.filter(
  132. db.not_(Group.id == user.primary_group_id),
  133. db.not_(Group.banned == True),
  134. db.not_(Group.guest == True))
  135. form = EditUserForm(user)
  136. form.secondary_groups.query = secondary_group_query
  137. if form.validate_on_submit():
  138. form.populate_obj(user)
  139. user.primary_group_id = form.primary_group.data.id
  140. # Don't override the password
  141. if form.password.data:
  142. user.password = form.password.data
  143. user.save(groups=form.secondary_groups.data)
  144. flash("User successfully edited", "success")
  145. return redirect(url_for("admin.edit_user", user_id=user.id))
  146. else:
  147. form.username.data = user.username
  148. form.email.data = user.email
  149. form.birthday.data = user.birthday
  150. form.gender.data = user.gender
  151. form.website.data = user.website
  152. form.location.data = user.location
  153. form.signature.data = user.signature
  154. form.avatar.data = user.avatar
  155. form.notes.data = user.notes
  156. form.primary_group.data = user.primary_group
  157. form.secondary_groups.data = user.secondary_groups
  158. return render_template("admin/user_form.html", form=form,
  159. title="Edit User")
  160. @admin.route("/users/<int:user_id>/delete")
  161. @admin_required
  162. def delete_user(user_id):
  163. user = User.query.filter_by(id=user_id).first_or_404()
  164. user.delete()
  165. flash("User successfully deleted", "success")
  166. return redirect(url_for("admin.users"))
  167. @admin.route("/users/add", methods=["GET", "POST"])
  168. @admin_required
  169. def add_user():
  170. form = AddUserForm()
  171. if form.validate_on_submit():
  172. form.save()
  173. flash("User successfully added.", "success")
  174. return redirect(url_for("admin.users"))
  175. return render_template("admin/user_form.html", form=form,
  176. title="Add User")
  177. @admin.route("/groups/<int:group_id>/edit", methods=["GET", "POST"])
  178. @admin_required
  179. def edit_group(group_id):
  180. group = Group.query.filter_by(id=group_id).first_or_404()
  181. form = EditGroupForm(group)
  182. if form.validate_on_submit():
  183. form.populate_obj(group)
  184. group.save()
  185. flash("Group successfully edited.", "success")
  186. return redirect(url_for("admin.groups", group_id=group.id))
  187. else:
  188. form.name.data = group.name
  189. form.description.data = group.description
  190. form.admin.data = group.admin
  191. form.super_mod.data = group.super_mod
  192. form.mod.data = group.mod
  193. form.guest.data = group.guest
  194. form.banned.data = group.banned
  195. form.editpost.data = group.editpost
  196. form.deletepost.data = group.deletepost
  197. form.deletetopic.data = group.deletetopic
  198. form.posttopic.data = group.posttopic
  199. form.postreply.data = group.postreply
  200. return render_template("admin/group_form.html", form=form,
  201. title="Edit Group")
  202. @admin.route("/groups/<int:group_id>/delete")
  203. @admin_required
  204. def delete_group(group_id):
  205. group = Group.query.filter_by(id=group_id).first_or_404()
  206. group.delete()
  207. flash("Group successfully deleted.", "success")
  208. return redirect(url_for("admin.groups"))
  209. @admin.route("/groups/add", methods=["GET", "POST"])
  210. @admin_required
  211. def add_group():
  212. form = AddGroupForm()
  213. if form.validate_on_submit():
  214. form.save()
  215. flash("Group successfully added.", "success")
  216. return redirect(url_for("admin.groups"))
  217. return render_template("admin/group_form.html", form=form,
  218. title="Add Group")
  219. @admin.route("/forums/<int:forum_id>/edit", methods=["GET", "POST"])
  220. @admin_required
  221. def edit_forum(forum_id):
  222. forum = Forum.query.filter_by(id=forum_id).first_or_404()
  223. form = EditForumForm(forum)
  224. if form.validate_on_submit():
  225. form.populate_obj(forum)
  226. forum.save(moderators=form.moderators.data)
  227. flash("Forum successfully edited.", "success")
  228. return redirect(url_for("admin.edit_forum", forum_id=forum.id))
  229. else:
  230. form.title.data = forum.title
  231. form.description.data = forum.description
  232. form.position.data = forum.position
  233. form.category.data = forum.category
  234. form.external.data = forum.external
  235. form.locked.data = forum.locked
  236. form.show_moderators.data = forum.show_moderators
  237. if forum.moderators:
  238. form.moderators.data = ",".join([user.username
  239. for user in forum.moderators])
  240. else:
  241. form.moderators.data = None
  242. return render_template("admin/forum_form.html", form=form,
  243. title="Edit Forum")
  244. @admin.route("/forums/<int:forum_id>/delete")
  245. @admin_required
  246. def delete_forum(forum_id):
  247. forum = Forum.query.filter_by(id=forum_id).first_or_404()
  248. involved_users = User.query.filter(Topic.forum_id == forum.id,
  249. Post.user_id == User.id).all()
  250. forum.delete(involved_users)
  251. flash("Forum successfully deleted.", "success")
  252. return redirect(url_for("admin.forums"))
  253. @admin.route("/forums/add", methods=["GET", "POST"])
  254. @admin.route("/forums/<int:category_id>/add", methods=["GET", "POST"])
  255. @admin_required
  256. def add_forum(category_id=None):
  257. form = AddForumForm()
  258. if form.validate_on_submit():
  259. form.save()
  260. flash("Forum successfully added.", "success")
  261. return redirect(url_for("admin.forums"))
  262. else:
  263. if category_id:
  264. category = Category.query.filter_by(id=category_id).first()
  265. form.category.data = category
  266. return render_template("admin/forum_form.html", form=form,
  267. title="Add Forum")
  268. @admin.route("/category/add", methods=["GET", "POST"])
  269. @admin_required
  270. def add_category():
  271. form = CategoryForm()
  272. if form.validate_on_submit():
  273. form.save()
  274. flash("Category successfully created.", "success")
  275. return redirect(url_for("admin.forums"))
  276. return render_template("admin/category_form.html", form=form,
  277. title="Add Category")
  278. @admin.route("/category/<int:category_id>/edit", methods=["GET", "POST"])
  279. @admin_required
  280. def edit_category(category_id):
  281. category = Category.query.filter_by(id=category_id).first_or_404()
  282. form = CategoryForm()
  283. if form.validate_on_submit():
  284. form.populate_obj(category)
  285. category.save()
  286. else:
  287. form.title.data = category.title
  288. form.description.data = category.description
  289. form.position.data = category.position
  290. return render_template("admin/category_form.html", form=form,
  291. title="Edit Category")
  292. @admin.route("/category/<int:category_id>/delete", methods=["GET", "POST"])
  293. @admin_required
  294. def delete_category(category_id):
  295. category = Category.query.filter_by(id=category_id).first_or_404()
  296. involved_users = User.query.filter(Forum.category_id == category.id,
  297. Topic.forum_id == Forum.id,
  298. Post.user_id == User.id).all()
  299. category.delete(involved_users)
  300. flash("Category with all associated forums deleted.", "success")
  301. return redirect(url_for("admin.forums"))