views.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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
  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. NewMessage)
  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. days_registered = (datetime.utcnow() - user.date_joined).days
  25. if not days_registered:
  26. days_registered = 1
  27. posts_per_day = round((float(user.post_count) / float(days_registered)), 1)
  28. return render_template("user/profile.html", user=user,
  29. days_registered=days_registered,
  30. posts_per_day=posts_per_day)
  31. @user.route("/<username>/topics")
  32. def view_all_topics(username):
  33. page = request.args.get("page", 1, type=int)
  34. user = User.query.filter_by(username=username).first_or_404()
  35. topics = user.all_topics(page)
  36. return render_template("user/all_topics.html", user=user, topics=topics)
  37. @user.route("/<username>/posts")
  38. def view_all_posts(username):
  39. page = request.args.get("page", 1, type=int)
  40. user = User.query.filter_by(username=username).first_or_404()
  41. posts = user.all_posts(page)
  42. return render_template("user/all_posts.html", user=user, posts=posts)
  43. @user.route("/settings/general", methods=["POST", "GET"])
  44. @login_required
  45. def settings():
  46. form = GeneralSettingsForm()
  47. form.theme.choices = [(theme.identifier, theme.name)
  48. for theme in get_themes_list()]
  49. if form.validate_on_submit():
  50. current_user.theme = form.theme.data
  51. current_user.save()
  52. flash("Your settings have been updated!", "success")
  53. else:
  54. form.theme.data = current_user.theme
  55. return render_template("user/general_settings.html", form=form)
  56. @user.route("/settings/password", methods=["POST", "GET"])
  57. @login_required
  58. def change_password():
  59. form = ChangePasswordForm()
  60. if form.validate_on_submit():
  61. current_user.password = form.new_password.data
  62. current_user.save()
  63. flash("Your password have been updated!", "success")
  64. return render_template("user/change_password.html", form=form)
  65. @user.route("/settings/email", methods=["POST", "GET"])
  66. @login_required
  67. def change_email():
  68. form = ChangeEmailForm(current_user)
  69. if form.validate_on_submit():
  70. current_user.email = form.new_email.data
  71. current_user.save()
  72. flash("Your email have been updated!", "success")
  73. return render_template("user/change_email.html", form=form)
  74. @user.route("/settings/user-details", methods=["POST", "GET"])
  75. @login_required
  76. def change_user_details():
  77. form = ChangeUserDetailsForm()
  78. if form.validate_on_submit():
  79. form.populate_obj(current_user)
  80. current_user.save()
  81. flash("Your details have been updated!", "success")
  82. else:
  83. form.birthday.data = current_user.birthday
  84. form.gender.data = current_user.gender
  85. form.location.data = current_user.location
  86. form.website.data = current_user.website
  87. form.avatar.data = current_user.avatar
  88. form.signature.data = current_user.signature
  89. form.notes.data = current_user.notes
  90. return render_template("user/change_user_details.html", form=form)
  91. @user.route("/messages")
  92. @user.route("/messages/inbox")
  93. @login_required
  94. def inbox():
  95. messages = PrivateMessage.query.filter(
  96. PrivateMessage.user_id == current_user.id,
  97. PrivateMessage.draft == False,
  98. PrivateMessage.trash == False,
  99. db.not_(PrivateMessage.from_user_id == current_user.id)).all()
  100. return render_template("message/inbox.html", messages=messages)
  101. @user.route("/messages/<int:id>/view")
  102. @login_required
  103. def view_message(id):
  104. message = PrivateMessage.query.filter_by(id=id).first()
  105. if message.unread:
  106. message.unread = False
  107. db.session.commit()
  108. return render_template("message/view_message.html", message=message)
  109. @user.route("/messages/sent")
  110. @login_required
  111. def sent():
  112. messages = PrivateMessage.query.filter(
  113. PrivateMessage.user_id == current_user.id,
  114. PrivateMessage.draft == False,
  115. PrivateMessage.trash == False,
  116. db.not_(PrivateMessage.to_user_id == current_user.id)).all()
  117. return render_template("message/sent.html", messages=messages)
  118. @user.route("/messages/trash")
  119. @login_required
  120. def trash():
  121. messages = PrivateMessage.query.filter(
  122. PrivateMessage.user_id == current_user.id,
  123. PrivateMessage.trash == True).all()
  124. return render_template("message/trash.html", messages=messages)
  125. @user.route("/messages/draft")
  126. @login_required
  127. def drafts():
  128. messages = PrivateMessage.query.filter(
  129. PrivateMessage.user_id == current_user.id,
  130. PrivateMessage.draft == True,
  131. PrivateMessage.trash == False).all()
  132. return render_template("message/drafts.html", messages=messages)
  133. @user.route("/messages/new", methods=["POST", "GET"])
  134. @login_required
  135. def new_message():
  136. form = NewMessage()
  137. to_user = request.args.get("to_user")
  138. if request.method == "POST":
  139. if "save_message" in request.form:
  140. to_user = User.query.filter_by(username=form.to_user.data).first()
  141. form.save(from_user=current_user.id,
  142. to_user=to_user.id,
  143. user_id=current_user.id,
  144. unread=False,
  145. as_draft=True)
  146. flash("Message saved!", "success")
  147. return redirect(url_for("user.drafts"))
  148. if "send_message" in request.form and form.validate():
  149. to_user = User.query.filter_by(username=form.to_user.data).first()
  150. # Save the message in the current users inbox
  151. form.save(from_user=current_user.id,
  152. to_user=to_user.id,
  153. user_id=current_user.id,
  154. unread=False)
  155. # Save the message in the recievers inbox
  156. form.save(from_user=current_user.id,
  157. to_user=to_user.id,
  158. user_id=to_user.id,
  159. unread=True)
  160. flash("Message sent!", "success")
  161. return redirect(url_for("user.sent"))
  162. else:
  163. form.to_user.data = to_user
  164. return render_template("message/new_message.html", form=form)
  165. @user.route("/messages/<int:id>/move")
  166. @login_required
  167. def move_message(id):
  168. message = PrivateMessage.query.filter_by(id=id).first_or_404()
  169. message.trash = True
  170. message.save()
  171. flash("Message moved to Trash!", "success")
  172. return redirect(url_for("user.inbox"))
  173. @user.route("/messages/<int:id>/delete")
  174. @login_required
  175. def delete_message(id):
  176. message = PrivateMessage.query.filter_by(id=id).first_or_404()
  177. message.delete()
  178. flash("Message deleted!", "success")
  179. return redirect(url_for("user.inbox"))