views.py 12 KB

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