views.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. # -*- coding: utf-8 -*-
  2. """
  3. flaskbb.user.views
  4. ~~~~~~~~~~~~~~~~~~~~
  5. The user view handles the user profile
  6. and the user settings from a signed in user.
  7. :copyright: (c) 2014 by the FlaskBB Team.
  8. :license: BSD, see LICENSE for more details.
  9. """
  10. from datetime import datetime
  11. from flask import Blueprint, flash, request, redirect, url_for
  12. from flask.ext.login import login_required, current_user
  13. from flask.ext.themes2 import get_themes_list
  14. from flaskbb.extensions import db, babel
  15. from flaskbb.utils.helpers import render_template
  16. from flaskbb.user.models import User, PrivateMessage
  17. from flaskbb.user.forms import (ChangePasswordForm, ChangeEmailForm,
  18. ChangeUserDetailsForm, GeneralSettingsForm,
  19. NewMessageForm, EditMessageForm)
  20. user = Blueprint("user", __name__)
  21. @user.route("/<username>")
  22. def profile(username):
  23. user = User.query.filter_by(username=username).first_or_404()
  24. return render_template("user/profile.html", user=user)
  25. @user.route("/<username>/topics")
  26. def view_all_topics(username):
  27. page = request.args.get("page", 1, type=int)
  28. user = User.query.filter_by(username=username).first_or_404()
  29. topics = user.all_topics(page)
  30. return render_template("user/all_topics.html", user=user, topics=topics)
  31. @user.route("/<username>/posts")
  32. def view_all_posts(username):
  33. page = request.args.get("page", 1, type=int)
  34. user = User.query.filter_by(username=username).first_or_404()
  35. posts = user.all_posts(page)
  36. return render_template("user/all_posts.html", user=user, posts=posts)
  37. @user.route("/settings/general", methods=["POST", "GET"])
  38. @login_required
  39. def settings():
  40. form = GeneralSettingsForm()
  41. form.theme.choices = [(theme.identifier, theme.name)
  42. for theme in get_themes_list()]
  43. form.language.choices = [(locale.language, locale.display_name)
  44. for locale in babel.list_translations()]
  45. if form.validate_on_submit():
  46. current_user.theme = form.theme.data
  47. current_user.language = form.language.data
  48. current_user.save()
  49. flash("Your settings have been updated!", "success")
  50. else:
  51. form.theme.data = current_user.theme
  52. form.theme.data = current_user.language
  53. return render_template("user/general_settings.html", form=form)
  54. @user.route("/settings/password", methods=["POST", "GET"])
  55. @login_required
  56. def change_password():
  57. form = ChangePasswordForm()
  58. if form.validate_on_submit():
  59. current_user.password = form.new_password.data
  60. current_user.save()
  61. flash("Your password have been updated!", "success")
  62. return render_template("user/change_password.html", form=form)
  63. @user.route("/settings/email", methods=["POST", "GET"])
  64. @login_required
  65. def change_email():
  66. form = ChangeEmailForm(current_user)
  67. if form.validate_on_submit():
  68. current_user.email = form.new_email.data
  69. current_user.save()
  70. flash("Your email have been updated!", "success")
  71. return render_template("user/change_email.html", form=form)
  72. @user.route("/settings/user-details", methods=["POST", "GET"])
  73. @login_required
  74. def change_user_details():
  75. form = ChangeUserDetailsForm(obj=current_user)
  76. if form.validate_on_submit():
  77. form.populate_obj(current_user)
  78. current_user.save()
  79. flash("Your details have been updated!", "success")
  80. return render_template("user/change_user_details.html", form=form)
  81. @user.route("/messages")
  82. @user.route("/messages/inbox")
  83. @login_required
  84. def inbox():
  85. messages = PrivateMessage.query.filter(
  86. PrivateMessage.user_id == current_user.id,
  87. PrivateMessage.draft == False,
  88. PrivateMessage.trash == False,
  89. db.not_(PrivateMessage.from_user_id == current_user.id)).all()
  90. return render_template("message/inbox.html", messages=messages)
  91. @user.route("/messages/<int:message_id>/view")
  92. @login_required
  93. def view_message(message_id):
  94. message = PrivateMessage.query.filter_by(id=message_id).first()
  95. if message.unread:
  96. message.unread = False
  97. db.session.commit()
  98. return render_template("message/view_message.html", message=message)
  99. @user.route("/messages/sent")
  100. @login_required
  101. def sent():
  102. messages = PrivateMessage.query.filter(
  103. PrivateMessage.user_id == current_user.id,
  104. PrivateMessage.draft == False,
  105. PrivateMessage.trash == False,
  106. db.not_(PrivateMessage.to_user_id == current_user.id)).all()
  107. return render_template("message/sent.html", messages=messages)
  108. @user.route("/messages/trash")
  109. @login_required
  110. def trash():
  111. messages = PrivateMessage.query.filter(
  112. PrivateMessage.user_id == current_user.id,
  113. PrivateMessage.trash == True).all()
  114. return render_template("message/trash.html", messages=messages)
  115. @user.route("/messages/draft")
  116. @login_required
  117. def drafts():
  118. messages = PrivateMessage.query.filter(
  119. PrivateMessage.user_id == current_user.id,
  120. PrivateMessage.draft == True,
  121. PrivateMessage.trash == False).all()
  122. return render_template("message/drafts.html", messages=messages)
  123. @user.route("/messages/new", methods=["POST", "GET"])
  124. @login_required
  125. def new_message():
  126. form = NewMessageForm()
  127. to_user = request.args.get("to_user")
  128. if request.method == "POST":
  129. if "save_message" in request.form and form.validate():
  130. to_user = User.query.filter_by(username=form.to_user.data).first()
  131. form.save(from_user=current_user.id,
  132. to_user=to_user.id,
  133. user_id=current_user.id,
  134. unread=False,
  135. as_draft=True)
  136. flash("Message saved!", "success")
  137. return redirect(url_for("user.drafts"))
  138. if "send_message" in request.form and form.validate():
  139. to_user = User.query.filter_by(username=form.to_user.data).first()
  140. # Save the message in the current users inbox
  141. form.save(from_user=current_user.id,
  142. to_user=to_user.id,
  143. user_id=current_user.id,
  144. unread=False)
  145. # Save the message in the recievers inbox
  146. form.save(from_user=current_user.id,
  147. to_user=to_user.id,
  148. user_id=to_user.id,
  149. unread=True)
  150. flash("Message sent!", "success")
  151. return redirect(url_for("user.sent"))
  152. else:
  153. form.to_user.data = to_user
  154. return render_template("message/message_form.html", form=form,
  155. title="Compose Message")
  156. @user.route("/messages/<int:message_id>/edit", methods=["POST", "GET"])
  157. @login_required
  158. def edit_message(message_id):
  159. message = PrivateMessage.query.filter_by(id=message_id).first_or_404()
  160. if not message.draft:
  161. flash("You cannot edit a sent message", "danger")
  162. return redirect(url_for("user.inbox"))
  163. form = EditMessageForm()
  164. if request.method == "POST":
  165. if "save_message" in request.form:
  166. to_user = User.query.filter_by(username=form.to_user.data).first()
  167. # Move the message from ``Drafts`` to ``Sent``.
  168. message.draft = False
  169. message.to_user = to_user.id
  170. message.save()
  171. flash("Message saved!", "success")
  172. return redirect(url_for("user.drafts"))
  173. if "send_message" in request.form and form.validate():
  174. to_user = User.query.filter_by(username=form.to_user.data).first()
  175. # Save the message in the recievers inbox
  176. form.save(from_user=current_user.id,
  177. to_user=to_user.id,
  178. user_id=to_user.id,
  179. unread=True)
  180. # Move the message from ``Drafts`` to ``Sent``.
  181. message.draft = False
  182. message.to_user = to_user
  183. message.date_created = datetime.utcnow()
  184. message.save()
  185. flash("Message sent!", "success")
  186. return redirect(url_for("user.sent"))
  187. else:
  188. form.to_user.data = message.to_user.username
  189. form.subject.data = message.subject
  190. form.message.data = message.message
  191. return render_template("message/message_form.html", form=form,
  192. title="Edit Message")
  193. @user.route("/messages/<int:message_id>/move")
  194. @login_required
  195. def move_message(message_id):
  196. message = PrivateMessage.query.filter_by(id=message_id).first_or_404()
  197. message.trash = True
  198. message.save()
  199. flash("Message moved to Trash!", "success")
  200. return redirect(url_for("user.inbox"))
  201. @user.route("/messages/<int:message_id>/restore")
  202. @login_required
  203. def restore_message(message_id):
  204. message = PrivateMessage.query.filter_by(id=message_id).first_or_404()
  205. message.trash = False
  206. message.save()
  207. flash("Message restored from Trash!", "success")
  208. return redirect(url_for("user.inbox"))
  209. @user.route("/messages/<int:message_id>/delete")
  210. @login_required
  211. def delete_message(message_id):
  212. message = PrivateMessage.query.filter_by(id=message_id).first_or_404()
  213. message.delete()
  214. flash("Message deleted!", "success")
  215. return redirect(url_for("user.inbox"))