|
@@ -8,171 +8,25 @@
|
|
|
:copyright: (c) 2014 by the FlaskBB Team.
|
|
|
:license: BSD, see LICENSE for more details.
|
|
|
"""
|
|
|
-from functools import wraps
|
|
|
import uuid
|
|
|
+from functools import wraps
|
|
|
|
|
|
-from flask import Blueprint, redirect, request, url_for, flash, abort
|
|
|
+from flask import Blueprint, abort, flash, redirect, request, url_for
|
|
|
from flask.views import MethodView
|
|
|
-from flask_login import login_required, current_user
|
|
|
from flask_babelplus import gettext as _
|
|
|
+from flask_login import current_user, login_required
|
|
|
|
|
|
from flaskbb.extensions import db
|
|
|
-from flaskbb.utils.settings import flaskbb_config
|
|
|
-from flaskbb.utils.helpers import (format_quote, register_view,
|
|
|
- render_template, time_utcnow)
|
|
|
from flaskbb.message.forms import ConversationForm, MessageForm
|
|
|
from flaskbb.message.models import Conversation, Message
|
|
|
from flaskbb.user.models import User
|
|
|
+from flaskbb.utils.helpers import (format_quote, register_view,
|
|
|
+ render_template, time_utcnow)
|
|
|
+from flaskbb.utils.settings import flaskbb_config
|
|
|
|
|
|
message = Blueprint("message", __name__)
|
|
|
|
|
|
|
|
|
-@message.route("/")
|
|
|
-@message.route("/inbox")
|
|
|
-@login_required
|
|
|
-def inbox():
|
|
|
- page = request.args.get('page', 1, type=int)
|
|
|
-
|
|
|
- # the inbox will display both, the recieved and the sent messages
|
|
|
- conversations = Conversation.query. \
|
|
|
- filter(
|
|
|
- Conversation.user_id == current_user.id,
|
|
|
- Conversation.draft == False,
|
|
|
- Conversation.trash == False,
|
|
|
- ).\
|
|
|
- order_by(Conversation.date_modified.desc()). \
|
|
|
- paginate(page, flaskbb_config['TOPICS_PER_PAGE'], False)
|
|
|
-
|
|
|
- # we can't simply do conversations.total because it would ignore
|
|
|
- # drafted and trashed messages
|
|
|
- message_count = Conversation.query. \
|
|
|
- filter(Conversation.user_id == current_user.id).\
|
|
|
- count()
|
|
|
-
|
|
|
- return render_template("message/inbox.html", conversations=conversations,
|
|
|
- message_count=message_count)
|
|
|
-
|
|
|
-
|
|
|
-@message.route("/message/<int:message_id>/raw")
|
|
|
-@login_required
|
|
|
-def raw_message(message_id):
|
|
|
- message = Message.query.filter_by(id=message_id).first_or_404()
|
|
|
-
|
|
|
- # abort if the message was not the current_user's one or the one of the
|
|
|
- # recieved ones
|
|
|
- if not (message.conversation.from_user_id == current_user.id or
|
|
|
- message.conversation.to_user_id == current_user.id):
|
|
|
- abort(404)
|
|
|
-
|
|
|
- return format_quote(username=message.user.username,
|
|
|
- content=message.message)
|
|
|
-
|
|
|
-
|
|
|
-@message.route("/<int:conversation_id>/move", methods=["POST"])
|
|
|
-@login_required
|
|
|
-def move_conversation(conversation_id):
|
|
|
- conversation = Conversation.query.filter_by(
|
|
|
- id=conversation_id,
|
|
|
- user_id=current_user.id
|
|
|
- ).first_or_404()
|
|
|
-
|
|
|
- conversation.trash = True
|
|
|
- conversation.save()
|
|
|
-
|
|
|
- return redirect(url_for("message.inbox"))
|
|
|
-
|
|
|
-
|
|
|
-@message.route("/<int:conversation_id>/restore", methods=["POST"])
|
|
|
-@login_required
|
|
|
-def restore_conversation(conversation_id):
|
|
|
- conversation = Conversation.query.filter_by(
|
|
|
- id=conversation_id,
|
|
|
- user_id=current_user.id
|
|
|
- ).first_or_404()
|
|
|
-
|
|
|
- conversation.trash = False
|
|
|
- conversation.save()
|
|
|
- return redirect(url_for("message.inbox"))
|
|
|
-
|
|
|
-
|
|
|
-@message.route("/<int:conversation_id>/delete", methods=["POST"])
|
|
|
-@login_required
|
|
|
-def delete_conversation(conversation_id):
|
|
|
- conversation = Conversation.query.filter_by(
|
|
|
- id=conversation_id,
|
|
|
- user_id=current_user.id
|
|
|
- ).first_or_404()
|
|
|
-
|
|
|
- conversation.delete()
|
|
|
- return redirect(url_for("message.inbox"))
|
|
|
-
|
|
|
-
|
|
|
-@message.route("/sent")
|
|
|
-@login_required
|
|
|
-def sent():
|
|
|
- page = request.args.get('page', 1, type=int)
|
|
|
-
|
|
|
- conversations = Conversation.query. \
|
|
|
- filter(
|
|
|
- Conversation.user_id == current_user.id,
|
|
|
- Conversation.draft == False,
|
|
|
- Conversation.trash == False,
|
|
|
- db.not_(Conversation.to_user_id == current_user.id)
|
|
|
- ).\
|
|
|
- order_by(Conversation.date_modified.desc()). \
|
|
|
- paginate(page, flaskbb_config['TOPICS_PER_PAGE'], False)
|
|
|
-
|
|
|
- message_count = Conversation.query. \
|
|
|
- filter(Conversation.user_id == current_user.id).\
|
|
|
- count()
|
|
|
-
|
|
|
- return render_template("message/sent.html", conversations=conversations,
|
|
|
- message_count=message_count)
|
|
|
-
|
|
|
-
|
|
|
-@message.route("/draft")
|
|
|
-@login_required
|
|
|
-def drafts():
|
|
|
- page = request.args.get('page', 1, type=int)
|
|
|
-
|
|
|
- conversations = Conversation.query. \
|
|
|
- filter(
|
|
|
- Conversation.user_id == current_user.id,
|
|
|
- Conversation.draft == True,
|
|
|
- Conversation.trash == False
|
|
|
- ).\
|
|
|
- order_by(Conversation.date_modified.desc()). \
|
|
|
- paginate(page, flaskbb_config['TOPICS_PER_PAGE'], False)
|
|
|
-
|
|
|
- message_count = Conversation.query. \
|
|
|
- filter(Conversation.user_id == current_user.id).\
|
|
|
- count()
|
|
|
-
|
|
|
- return render_template("message/drafts.html", conversations=conversations,
|
|
|
- message_count=message_count)
|
|
|
-
|
|
|
-
|
|
|
-@message.route("/trash")
|
|
|
-@login_required
|
|
|
-def trash():
|
|
|
- page = request.args.get('page', 1, type=int)
|
|
|
-
|
|
|
- conversations = Conversation.query. \
|
|
|
- filter(
|
|
|
- Conversation.user_id == current_user.id,
|
|
|
- Conversation.trash == True,
|
|
|
- ).\
|
|
|
- order_by(Conversation.date_modified.desc()). \
|
|
|
- paginate(page, flaskbb_config['TOPICS_PER_PAGE'], False)
|
|
|
-
|
|
|
- message_count = Conversation.query. \
|
|
|
- filter(Conversation.user_id == current_user.id).\
|
|
|
- count()
|
|
|
-
|
|
|
- return render_template("message/trash.html", conversations=conversations,
|
|
|
- message_count=message_count)
|
|
|
-
|
|
|
-
|
|
|
def requires_message_box_space(f):
|
|
|
|
|
|
@wraps(f)
|
|
@@ -192,6 +46,33 @@ def requires_message_box_space(f):
|
|
|
return wrapper
|
|
|
|
|
|
|
|
|
+class Inbox(MethodView):
|
|
|
+ decorators = [login_required]
|
|
|
+
|
|
|
+ def get(self):
|
|
|
+ page = request.args.get('page', 1, type=int)
|
|
|
+
|
|
|
+ # the inbox will display both, the recieved and the sent messages
|
|
|
+ conversations = Conversation.query. \
|
|
|
+ filter(
|
|
|
+ Conversation.user_id == current_user.id,
|
|
|
+ Conversation.draft == False,
|
|
|
+ Conversation.trash == False,
|
|
|
+ ).\
|
|
|
+ order_by(Conversation.date_modified.desc()). \
|
|
|
+ paginate(page, flaskbb_config['TOPICS_PER_PAGE'], False)
|
|
|
+
|
|
|
+ # we can't simply do conversations.total because it would ignore
|
|
|
+ # drafted and trashed messages
|
|
|
+ message_count = Conversation.query. \
|
|
|
+ filter(Conversation.user_id == current_user.id).\
|
|
|
+ count()
|
|
|
+
|
|
|
+ return render_template(
|
|
|
+ "message/inbox.html", conversations=conversations, message_count=message_count
|
|
|
+ )
|
|
|
+
|
|
|
+
|
|
|
class ViewConversation(MethodView):
|
|
|
decorators = [login_required]
|
|
|
form = MessageForm
|
|
@@ -384,14 +265,161 @@ class EditConversation(MethodView):
|
|
|
return render_template("message/message_form.html", form=form, title=_("Edit Message"))
|
|
|
|
|
|
|
|
|
+class RawMessage(MethodView):
|
|
|
+ decorators = [login_required]
|
|
|
+
|
|
|
+ def get(self, message_id):
|
|
|
+
|
|
|
+ message = Message.query.filter_by(id=message_id).first_or_404()
|
|
|
+
|
|
|
+ # abort if the message was not the current_user's one or the one of the
|
|
|
+ # recieved ones
|
|
|
+ if not (message.conversation.from_user_id == current_user.id
|
|
|
+ or message.conversation.to_user_id == current_user.id):
|
|
|
+ abort(404)
|
|
|
+
|
|
|
+ return format_quote(username=message.user.username, content=message.message)
|
|
|
+
|
|
|
+
|
|
|
+class MoveConversation(MethodView):
|
|
|
+ decorators = [login_required]
|
|
|
+
|
|
|
+ def post(self, conversation_id):
|
|
|
+ conversation = Conversation.query.filter_by(
|
|
|
+ id=conversation_id, user_id=current_user.id
|
|
|
+ ).first_or_404()
|
|
|
+
|
|
|
+ conversation.trash = True
|
|
|
+ conversation.save()
|
|
|
+
|
|
|
+ return redirect(url_for("message.inbox"))
|
|
|
+
|
|
|
+
|
|
|
+class RestoreConversation(MethodView):
|
|
|
+ decorators = [login_required]
|
|
|
+
|
|
|
+ def post(self, conversation_id):
|
|
|
+ conversation = Conversation.query.filter_by(
|
|
|
+ id=conversation_id, user_id=current_user.id
|
|
|
+ ).first_or_404()
|
|
|
+
|
|
|
+ conversation.trash = False
|
|
|
+ conversation.save()
|
|
|
+ return redirect(url_for("message.inbox"))
|
|
|
+
|
|
|
+
|
|
|
+class DeleteConversation(MethodView):
|
|
|
+ decorators = [login_required]
|
|
|
+
|
|
|
+ def post(self, conversation_id):
|
|
|
+ conversation = Conversation.query.filter_by(
|
|
|
+ id=conversation_id, user_id=current_user.id
|
|
|
+ ).first_or_404()
|
|
|
+
|
|
|
+ conversation.delete()
|
|
|
+ return redirect(url_for("message.inbox"))
|
|
|
+
|
|
|
+
|
|
|
+class SentMessages(MethodView):
|
|
|
+ decorators = [login_required]
|
|
|
+
|
|
|
+ def get(self):
|
|
|
+
|
|
|
+ page = request.args.get('page', 1, type=int)
|
|
|
+
|
|
|
+ conversations = Conversation.query. \
|
|
|
+ filter(
|
|
|
+ Conversation.user_id == current_user.id,
|
|
|
+ Conversation.draft == False,
|
|
|
+ Conversation.trash == False,
|
|
|
+ db.not_(Conversation.to_user_id == current_user.id)
|
|
|
+ ).\
|
|
|
+ order_by(Conversation.date_modified.desc()). \
|
|
|
+ paginate(page, flaskbb_config['TOPICS_PER_PAGE'], False)
|
|
|
+
|
|
|
+ message_count = Conversation.query. \
|
|
|
+ filter(Conversation.user_id == current_user.id).\
|
|
|
+ count()
|
|
|
+
|
|
|
+ return render_template(
|
|
|
+ "message/sent.html", conversations=conversations, message_count=message_count
|
|
|
+ )
|
|
|
+
|
|
|
+
|
|
|
+class DraftMessages(MethodView):
|
|
|
+ decorators = [login_required]
|
|
|
+
|
|
|
+ def get(self):
|
|
|
+
|
|
|
+ page = request.args.get('page', 1, type=int)
|
|
|
+
|
|
|
+ conversations = Conversation.query. \
|
|
|
+ filter(
|
|
|
+ Conversation.user_id == current_user.id,
|
|
|
+ Conversation.draft == True,
|
|
|
+ Conversation.trash == False
|
|
|
+ ).\
|
|
|
+ order_by(Conversation.date_modified.desc()). \
|
|
|
+ paginate(page, flaskbb_config['TOPICS_PER_PAGE'], False)
|
|
|
+
|
|
|
+ message_count = Conversation.query. \
|
|
|
+ filter(Conversation.user_id == current_user.id).\
|
|
|
+ count()
|
|
|
+
|
|
|
+ return render_template(
|
|
|
+ "message/drafts.html", conversations=conversations, message_count=message_count
|
|
|
+ )
|
|
|
+
|
|
|
+
|
|
|
+class TrashedMessages(MethodView):
|
|
|
+ decorators = [login_required]
|
|
|
+
|
|
|
+ def get(self):
|
|
|
+
|
|
|
+ page = request.args.get('page', 1, type=int)
|
|
|
+
|
|
|
+ conversations = Conversation.query. \
|
|
|
+ filter(
|
|
|
+ Conversation.user_id == current_user.id,
|
|
|
+ Conversation.trash == True,
|
|
|
+ ).\
|
|
|
+ order_by(Conversation.date_modified.desc()). \
|
|
|
+ paginate(page, flaskbb_config['TOPICS_PER_PAGE'], False)
|
|
|
+
|
|
|
+ message_count = Conversation.query. \
|
|
|
+ filter(Conversation.user_id == current_user.id).\
|
|
|
+ count()
|
|
|
+
|
|
|
+ return render_template(
|
|
|
+ "message/trash.html", conversations=conversations, message_count=message_count
|
|
|
+ )
|
|
|
+
|
|
|
+
|
|
|
+register_view(message, routes=['/drafts'], DraftMessages.as_view('drafts'))
|
|
|
+register_view(message, routes=['/', '/inbox'], view_func=Inbox.as_view('inbox'))
|
|
|
register_view(
|
|
|
message,
|
|
|
- routes=["/<int:conversation_id>/view"],
|
|
|
- view_func=ViewConversation.as_view('view_conversation')
|
|
|
+ routes=['/int:conversation_id>/delete'],
|
|
|
+ DeleteConversation.as_view('delete_conversation')
|
|
|
)
|
|
|
-register_view(message, routes=["/new"], view_func=NewConversation.as_view('new_conversation'))
|
|
|
register_view(
|
|
|
message,
|
|
|
routes=["/<int:conversation_id>/edit"],
|
|
|
view_func=EditConversation.as_view('edit_conversation')
|
|
|
)
|
|
|
+register_view(
|
|
|
+ message, routes=['/<int:conversation_id>/move'], MoveConversation.as_view('move_conversation')
|
|
|
+)
|
|
|
+register_view(
|
|
|
+ message.routes=['/<int:conversation_id>/restore'],
|
|
|
+ RestoreConversation.as_view('restore_conversation')
|
|
|
+)
|
|
|
+register_view(
|
|
|
+ message,
|
|
|
+ routes=["/<int:conversation_id>/view"],
|
|
|
+ view_func=ViewConversation.as_view('view_conversation')
|
|
|
+)
|
|
|
+register_view(message, routes=['/message/<int:message_id>/raw'], RawMessage.as_view('raw_message'))
|
|
|
+register_view(message, routes=["/new"], view_func=NewConversation.as_view('new_conversation'))
|
|
|
+register_view(message, routes=['/sent'], SentMessages.as_view('sent'))
|
|
|
+register_view(message, routes=['/trash'], TrashedMessages.as_view('trash'))
|