models.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. from datetime import datetime
  2. from sqlalchemy_utils import UUIDType
  3. from flaskbb.extensions import db
  4. class Conversation(db.Model):
  5. __tablename__ = "conversations"
  6. id = db.Column(db.Integer, primary_key=True)
  7. user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
  8. from_user_id = db.Column(db.Integer, db.ForeignKey("users.id"))
  9. to_user_id = db.Column(db.Integer, db.ForeignKey("users.id"))
  10. shared_id = db.Column(UUIDType, nullable=False)
  11. subject = db.Column(db.String(255))
  12. date_created = db.Column(db.DateTime, default=datetime.utcnow())
  13. trash = db.Column(db.Boolean, nullable=False, default=False)
  14. draft = db.Column(db.Boolean, nullable=False, default=False)
  15. unread = db.Column(db.Boolean, nullable=False, default=True)
  16. messages = db.relationship(
  17. "Message", lazy="dynamic", backref="conversation",
  18. primaryjoin="Message.conversation_id == Conversation.id",
  19. cascade="all, delete-orphan"
  20. )
  21. # this is actually the users message box
  22. user = db.relationship("User", lazy="joined", foreign_keys=[user_id])
  23. # the user to whom the conversation is addressed
  24. to_user = db.relationship("User", lazy="joined", foreign_keys=[to_user_id])
  25. # the user who sent the message
  26. from_user = db.relationship("User", lazy="joined",
  27. foreign_keys=[from_user_id])
  28. @property
  29. def first_message(self):
  30. return self.messages[0].message
  31. @property
  32. def last_message(self):
  33. return self.messages[-1].message
  34. def save(self, message=None, user_id=None, from_user=None, to_user=None):
  35. """Saves a conversation.
  36. :param message: The Message object.
  37. :param user_id: The senders user id - This is the id to which user the
  38. conversation belongs.
  39. :param from_user: The user who has created the conversation
  40. :param to_user: The user who should recieve the conversation
  41. """
  42. if self.id:
  43. db.session.add(self)
  44. db.session.commit()
  45. return self
  46. if message is not None:
  47. # create the conversation
  48. self.user_id = user_id
  49. self.from_user_id = from_user
  50. self.to_user_id = to_user
  51. self.date_created = datetime.utcnow()
  52. db.session.add(self)
  53. db.session.commit()
  54. # create the actual message for the conversation
  55. message.save(self)
  56. return self
  57. def delete(self):
  58. """Deletes a private message"""
  59. db.session.delete(self)
  60. db.session.commit()
  61. return self
  62. class Message(db.Model):
  63. __tablename__ = "messages"
  64. id = db.Column(db.Integer, primary_key=True)
  65. conversation_id = db.Column(db.Integer, db.ForeignKey("conversations.id"),
  66. nullable=False)
  67. # the user who wrote the message
  68. user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
  69. message = db.Column(db.Text, nullable=False)
  70. date_created = db.Column(db.DateTime, default=datetime.utcnow())
  71. user = db.relationship("User", lazy="joined")
  72. def save(self, conversation):
  73. """Saves a private message.
  74. :param conversation_id: The id of the conversation to which the message
  75. belongs to.
  76. """
  77. self.conversation_id = conversation.id
  78. self.date_created = datetime.utcnow()
  79. db.session.add(self)
  80. db.session.commit()
  81. return self
  82. def delete(self):
  83. """Deletes a private message"""
  84. db.session.delete(self)
  85. db.session.commit()
  86. return self