views.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. from datetime import datetime
  2. from flask import Blueprint, redirect, request, url_for, flash, abort
  3. from flask_login import login_required, current_user
  4. from flask_babelex import gettext as _
  5. from flaskbb.extensions import db
  6. from flaskbb.utils.settings import flaskbb_config
  7. from flaskbb.utils.helpers import render_template, format_quote
  8. from flaskbb.message.forms import ConversationForm, MessageForm
  9. from flaskbb.message.models import Conversation, Message
  10. from flaskbb.user.models import User
  11. message = Blueprint("message", __name__)
  12. @message.route("/")
  13. @message.route("/inbox")
  14. @login_required
  15. def inbox():
  16. page = request.args.get('page', 1, type=int)
  17. conversations = Conversation.query.\
  18. filter(
  19. Conversation.user_id == current_user.id,
  20. Conversation.draft == False,
  21. Conversation.trash == False
  22. ).\
  23. order_by(Conversation.id.asc()).\
  24. paginate(page, flaskbb_config['TOPICS_PER_PAGE'], False)
  25. message_count = Conversation.query.\
  26. filter(Conversation.user_id == current_user.id).\
  27. count()
  28. return render_template("message/inbox.html", conversations=conversations,
  29. message_count=message_count)
  30. @message.route("/<int:conversation_id>/view", methods=["GET", "POST"])
  31. def view_conversation(conversation_id):
  32. conversation = Conversation.query.filter_by(
  33. id=conversation_id).first_or_404()
  34. if conversation.user_id != current_user.id:
  35. # if a user tries to view a conversation which does not belong to him
  36. # just abort with 404
  37. abort(404)
  38. form = MessageForm()
  39. if form.validate_on_submit():
  40. message_count = Conversation.query.\
  41. filter(Conversation.user_id == current_user.id).\
  42. count()
  43. if message_count >= flaskbb_config["MESSAGE_QUOTA"]:
  44. flash(_("You cannot send any messages anymore because you have"
  45. "reached your message limit."), "danger")
  46. return redirect(url_for("message.view_conversation",
  47. conversation_id=conversation.id))
  48. form.save(conversation=conversation, user_id=current_user.id,
  49. reciever=True)
  50. return redirect(url_for("message.view_conversation",
  51. conversation_id=conversation.id))
  52. return render_template("message/conversation.html",
  53. conversation=conversation, form=form)
  54. @message.route("/new", methods=["POST", "GET"])
  55. @login_required
  56. def new_conversation():
  57. form = ConversationForm()
  58. to_user = request.args.get("to_user")
  59. message_count = Conversation.query.\
  60. filter(Conversation.user_id == current_user.id).\
  61. count()
  62. if message_count >= flaskbb_config["MESSAGE_QUOTA"]:
  63. flash(_("You cannot send any messages anymore because you have"
  64. "reached your message limit."), "danger")
  65. return redirect(url_for("message.inbox"))
  66. if request.method == "POST":
  67. if "save_message" in request.form and form.validate():
  68. to_user = User.query.filter_by(username=form.to_user.data).first()
  69. form.save(from_user=current_user.id,
  70. to_user=to_user.id,
  71. user_id=current_user.id,
  72. unread=False,
  73. as_draft=True)
  74. flash(_("Message saved."), "success")
  75. return redirect(url_for("message.drafts"))
  76. if "send_message" in request.form and form.validate():
  77. to_user = User.query.filter_by(username=form.to_user.data).first()
  78. # Save the message in the current users inbox
  79. form.save(from_user=current_user.id,
  80. to_user=to_user.id,
  81. user_id=current_user.id,
  82. unread=False)
  83. # Save the message in the recievers inbox
  84. form.save(from_user=current_user.id,
  85. to_user=to_user.id,
  86. user_id=to_user.id,
  87. unread=True)
  88. flash(_("Message sent."), "success")
  89. return redirect(url_for("message.sent"))
  90. else:
  91. form.to_user.data = to_user
  92. return render_template("message/message_form.html", form=form,
  93. title=_("Compose Message"))
  94. @message.route("/message/<int:message_id>/raw")
  95. @login_required
  96. def raw_message(message_id):
  97. message = Message.query.filter_by(id=message_id).first_or_404()
  98. if not (message.conversation.from_user_id == current_user.id or
  99. message.conversation.to_user_id == current_user.id):
  100. abort(404)
  101. return format_quote(username=message.user.username,
  102. content=message.message)
  103. @message.route("/<int:conversation_id>/edit", methods=["POST", "GET"])
  104. @login_required
  105. def edit_conversation(conversation_id):
  106. conversation = Conversation.query.filter_by(
  107. id=conversation_id).first_or_404()
  108. if conversation.user_id != current_user.id:
  109. # if a user tries to view a conversation which does not belong to him
  110. # just abort with 404
  111. abort(404)
  112. if not conversation.draft:
  113. flash(_("You cannot edit a sent message."), "danger")
  114. return redirect(url_for("message.inbox"))
  115. form = ConversationForm()
  116. if request.method == "POST":
  117. if "save_message" in request.form:
  118. to_user = User.query.filter_by(username=form.to_user.data).first()
  119. conversation.draft = False
  120. conversation.to_user = to_user.id
  121. conversation.save()
  122. flash(_("Message saved."), "success")
  123. return redirect(url_for("message.drafts"))
  124. if "send_message" in request.form and form.validate():
  125. to_user = User.query.filter_by(username=form.to_user.data).first()
  126. # Save the message in the recievers inbox
  127. form.save(from_user=current_user.id,
  128. to_user=to_user.id,
  129. user_id=to_user.id,
  130. unread=True)
  131. # Move the message from ``Drafts`` to ``Sent``.
  132. conversation.draft = False
  133. conversation.to_user = to_user
  134. conversation.date_created = datetime.utcnow()
  135. conversation.save()
  136. flash(_("Message sent."), "success")
  137. return redirect(url_for("message.sent"))
  138. else:
  139. form.to_user.data = conversation.to_user.username
  140. form.subject.data = conversation.subject
  141. form.message.data = conversation.first_message
  142. return render_template("message/message_form.html", form=form,
  143. title=_("Edit Message"))
  144. @message.route("/sent")
  145. @login_required
  146. def sent():
  147. page = request.args.get('page', 1, type=int)
  148. conversations = Conversation.query.\
  149. filter(
  150. Conversation.user_id == current_user.id,
  151. Conversation.draft == False,
  152. Conversation.trash == False,
  153. db.not_(Conversation.to_user_id == current_user.id)
  154. ).\
  155. paginate(page, flaskbb_config['TOPICS_PER_PAGE'], False)
  156. message_count = Conversation.query.\
  157. filter(Conversation.user_id == current_user.id).\
  158. count()
  159. return render_template("message/sent.html", conversations=conversations,
  160. message_count=message_count)
  161. @message.route("/draft")
  162. @login_required
  163. def drafts():
  164. page = request.args.get('page', 1, type=int)
  165. conversations = Conversation.query.\
  166. filter(
  167. Conversation.user_id == current_user.id,
  168. Conversation.draft == True,
  169. Conversation.trash == False
  170. ).\
  171. paginate(page, flaskbb_config['TOPICS_PER_PAGE'], False)
  172. message_count = Conversation.query.\
  173. filter(Conversation.user_id == current_user.id).\
  174. count()
  175. return render_template("message/drafts.html", conversations=conversations,
  176. message_count=message_count)
  177. @message.route("/trash")
  178. @login_required
  179. def trash():
  180. page = request.args.get('page', 1, type=int)
  181. conversations = Conversation.query.\
  182. filter(
  183. Conversation.user_id == current_user.id,
  184. Conversation.trash == True,
  185. ).\
  186. paginate(page, flaskbb_config['TOPICS_PER_PAGE'], False)
  187. message_count = Conversation.query.\
  188. filter(Conversation.user_id == current_user.id).\
  189. count()
  190. return render_template("message/trash.html", conversations=conversations,
  191. message_count=message_count)