models.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. # -*- coding: utf-8 -*-
  2. """
  3. flaskbb.message.models
  4. ~~~~~~~~~~~~~~~~~~~~~~
  5. The models for the conversations and messages are located here.
  6. :copyright: (c) 2014 by the FlaskBB Team.
  7. :license: BSD, see LICENSE for more details.
  8. """
  9. import logging
  10. from sqlalchemy_utils import UUIDType
  11. from flaskbb.extensions import db
  12. from flaskbb.utils.helpers import time_utcnow
  13. from flaskbb.utils.database import CRUDMixin, UTCDateTime
  14. logger = logging.getLogger(__name__)
  15. class Conversation(db.Model, CRUDMixin):
  16. __tablename__ = "conversations"
  17. id = db.Column(db.Integer, primary_key=True)
  18. user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
  19. from_user_id = db.Column(db.Integer, db.ForeignKey("users.id"),
  20. nullable=True)
  21. to_user_id = db.Column(db.Integer, db.ForeignKey("users.id"),
  22. nullable=True)
  23. shared_id = db.Column(UUIDType, nullable=False)
  24. subject = db.Column(db.String(255), nullable=True)
  25. date_created = db.Column(UTCDateTime(timezone=True), default=time_utcnow,
  26. nullable=False)
  27. date_modified = db.Column(UTCDateTime(timezone=True), default=time_utcnow,
  28. nullable=False)
  29. trash = db.Column(db.Boolean, default=False, nullable=False)
  30. draft = db.Column(db.Boolean, default=False, nullable=False)
  31. unread = db.Column(db.Boolean, default=False, nullable=False)
  32. messages = db.relationship(
  33. "Message", lazy="joined", backref="conversation",
  34. primaryjoin="Message.conversation_id == Conversation.id",
  35. order_by="asc(Message.id)",
  36. cascade="all, delete-orphan"
  37. )
  38. # this is actually the users message box
  39. user = db.relationship("User", lazy="joined", foreign_keys=[user_id])
  40. # the user to whom the conversation is addressed
  41. to_user = db.relationship("User", lazy="joined", foreign_keys=[to_user_id])
  42. # the user who sent the message
  43. from_user = db.relationship("User", lazy="joined",
  44. foreign_keys=[from_user_id])
  45. @property
  46. def first_message(self):
  47. """Returns the first message object."""
  48. return self.messages[0]
  49. @property
  50. def last_message(self):
  51. """Returns the last message object."""
  52. return self.messages[-1]
  53. def save(self, message=None):
  54. """Saves a conversation and returns the saved conversation object.
  55. :param message: If given, it will also save the message for the
  56. conversation. It expects a Message object.
  57. """
  58. if message is not None:
  59. # create the conversation
  60. self.date_created = time_utcnow()
  61. db.session.add(self)
  62. db.session.commit()
  63. # create the actual message for the conversation
  64. message.save(self)
  65. return self
  66. self.date_modified = time_utcnow()
  67. db.session.add(self)
  68. db.session.commit()
  69. return self
  70. class Message(db.Model, CRUDMixin):
  71. __tablename__ = "messages"
  72. id = db.Column(db.Integer, primary_key=True)
  73. conversation_id = db.Column(db.Integer, db.ForeignKey("conversations.id"),
  74. nullable=False)
  75. # the user who wrote the message
  76. user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
  77. message = db.Column(db.Text, nullable=False)
  78. date_created = db.Column(UTCDateTime(timezone=True), default=time_utcnow,
  79. nullable=False)
  80. user = db.relationship("User", lazy="joined")
  81. def save(self, conversation=None):
  82. """Saves a private message.
  83. :param conversation: The conversation to which the message
  84. belongs to.
  85. """
  86. if conversation is not None:
  87. self.conversation = conversation
  88. conversation.date_modified = time_utcnow()
  89. self.date_created = time_utcnow()
  90. db.session.add(self)
  91. db.session.commit()
  92. return self