views.py 9.2 KB

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