models.py 3.5 KB

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