models.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # **************************************************************************
  4. # Copyright © 2016 jianglin
  5. # File Name: models.py
  6. # Author: jianglin
  7. # Email: xiyang0807@gmail.com
  8. # Created: 2016-12-15 20:52:07 (CST)
  9. # Last Update:星期三 2017-3-29 19:40:39 (CST)
  10. # By:
  11. # Description:
  12. # **************************************************************************
  13. from datetime import datetime
  14. from flask import current_app
  15. from flask_login import current_user
  16. from flask_maple.models import ModelMixin, ModelTimeMixin, ModelUserMixin
  17. from forums.api.forums.models import Board
  18. from forums.api.user.models import User
  19. from forums.common.models import CommonUserMixin
  20. from forums.extension import db
  21. topic_follower = db.Table(
  22. 'topic_follower',
  23. db.Column('topic_id', db.Integer, db.ForeignKey('topics.id')),
  24. db.Column('follower_id', db.Integer, db.ForeignKey('users.id')))
  25. class Topic(db.Model, ModelMixin):
  26. __tablename__ = 'topics'
  27. CONTENT_TYPE_TEXT = '0'
  28. CONTENT_TYPE_MARKDOWN = '1'
  29. CONTENT_TYPE_ORGMODE = '2'
  30. CONTENT_TYPE = (('0', 'text'), ('1', 'markdown'), ('2', 'org-mode'))
  31. id = db.Column(db.Integer, primary_key=True)
  32. title = db.Column(db.String(81), nullable=False)
  33. content = db.Column(db.Text, nullable=False)
  34. content_type = db.Column(
  35. db.String(10), nullable=False, default=CONTENT_TYPE_MARKDOWN)
  36. created_at = db.Column(
  37. db.DateTime, default=datetime.utcnow(), nullable=False)
  38. updated_at = db.Column(
  39. db.DateTime, default=datetime.utcnow(), onupdate=datetime.utcnow())
  40. is_good = db.Column(db.Boolean, default=False)
  41. is_top = db.Column(db.Boolean, default=False)
  42. author_id = db.Column(
  43. db.Integer, db.ForeignKey(
  44. 'users.id', ondelete="CASCADE"))
  45. author = db.relationship(
  46. User,
  47. backref=db.backref(
  48. 'topics', cascade='all,delete-orphan', lazy='dynamic'),
  49. lazy='joined')
  50. board_id = db.Column(
  51. db.Integer, db.ForeignKey(
  52. 'boards.id', ondelete="CASCADE"))
  53. board = db.relationship(
  54. Board,
  55. backref=db.backref(
  56. 'topics', cascade='all,delete-orphan', lazy='dynamic'),
  57. lazy='joined')
  58. followers = db.relationship(
  59. User,
  60. secondary=topic_follower,
  61. backref=db.backref(
  62. 'following_topics', lazy='dynamic'),
  63. lazy='dynamic')
  64. def is_followed(self, user=None):
  65. if user is None:
  66. user = current_user
  67. return db.session.query(topic_follower).filter(
  68. topic_follower.c.topic_id == self.id,
  69. topic_follower.c.follower_id == user.id).exists()
  70. def is_collected(self, user=None):
  71. if user is None:
  72. user = current_user
  73. return self.collects.filter_by(author_id=user.id).exists()
  74. @property
  75. def newest_reply(self):
  76. return self.replies.order_by('-id').first()
  77. @property
  78. def reply_count(self):
  79. return self.replies.count()
  80. @property
  81. def read_count(self):
  82. return self.replies.count()
  83. def __str__(self):
  84. return self.title
  85. def __repr__(self):
  86. return "<Topic %r>" % self.title
  87. reply_liker = db.Table(
  88. 'reply_liker',
  89. db.Column('reply_id', db.Integer, db.ForeignKey('replies.id')),
  90. db.Column('liker_id', db.Integer, db.ForeignKey('users.id')))
  91. class Reply(db.Model, ModelMixin):
  92. __tablename__ = 'replies'
  93. id = db.Column(db.Integer, primary_key=True)
  94. content = db.Column(db.Text, nullable=False)
  95. created_at = db.Column(
  96. db.DateTime, default=datetime.utcnow(), nullable=False)
  97. updated_at = db.Column(
  98. db.DateTime, default=datetime.utcnow(), onupdate=datetime.utcnow())
  99. topic_id = db.Column(
  100. db.Integer, db.ForeignKey(
  101. 'topics.id', ondelete="CASCADE"))
  102. topic = db.relationship(
  103. Topic,
  104. backref=db.backref(
  105. 'replies', cascade='all,delete-orphan', lazy='dynamic'),
  106. lazy='joined')
  107. author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
  108. author = db.relationship(
  109. User, backref=db.backref(
  110. 'replies', lazy='dynamic'), lazy='joined')
  111. likers = db.relationship(
  112. User,
  113. secondary=reply_liker,
  114. backref=db.backref(
  115. 'like_replies', lazy='dynamic'),
  116. lazy='dynamic')
  117. def is_liked(self, user=None):
  118. if user is None:
  119. user = current_user
  120. return self.likers.filter_by(id=user.id).exists()
  121. def __str__(self):
  122. return self.content[:10]
  123. def __repr__(self):
  124. return "<Topic %r>" % self.content[:10]