models.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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-25 21:45:35 (CST)
  10. # By:
  11. # Description:
  12. # **************************************************************************
  13. from datetime import datetime
  14. from flask import current_app
  15. from flask_maple.models import ModelMixin, ModelTimeMixin, ModelUserMixin
  16. from forums.common.models import CommonUserMixin
  17. from forums.api.forums.models import Board
  18. from forums.api.user.models import User
  19. from forums.extension import db
  20. topics_follow_users = db.Table(
  21. 'topics_follow_users',
  22. db.Column('topics_id', db.Integer, db.ForeignKey('topics.id')),
  23. db.Column('follow_users_id', db.Integer, db.ForeignKey('users.id')))
  24. class Topic(db.Model, ModelMixin):
  25. __tablename__ = 'topics'
  26. CONTENT_TYPE_TEXT = '0'
  27. CONTENT_TYPE_MARKDOWN = '1'
  28. CONTENT_TYPE_ORGMODE = '2'
  29. CONTENT_TYPE = (('0', 'text'), ('1', 'markdown'), ('2', 'org-mode'))
  30. id = db.Column(db.Integer, primary_key=True)
  31. title = db.Column(db.String(81), nullable=False)
  32. content = db.Column(db.Text, nullable=False)
  33. content_type = db.Column(
  34. db.String(10), nullable=False, default=CONTENT_TYPE_MARKDOWN)
  35. created_at = db.Column(
  36. db.DateTime, default=datetime.utcnow(), nullable=False)
  37. updated_at = db.Column(
  38. db.DateTime, default=datetime.utcnow(), onupdate=datetime.utcnow())
  39. is_good = db.Column(db.Boolean, default=False)
  40. is_top = db.Column(db.Boolean, default=False)
  41. author_id = db.Column(
  42. db.Integer, db.ForeignKey(
  43. 'users.id', ondelete="CASCADE"))
  44. author = db.relationship(
  45. User,
  46. backref=db.backref(
  47. 'topics', cascade='all,delete-orphan', lazy='dynamic'),
  48. lazy='joined')
  49. board_id = db.Column(
  50. db.Integer, db.ForeignKey(
  51. 'boards.id', ondelete="CASCADE"))
  52. board = db.relationship(
  53. Board,
  54. backref=db.backref(
  55. 'topics', cascade='all,delete-orphan', lazy='dynamic'),
  56. lazy='joined')
  57. followers = db.relationship(
  58. User,
  59. secondary=topics_follow_users,
  60. backref=db.backref(
  61. 'following_topics', lazy='dynamic'),
  62. lazy='dynamic')
  63. def __str__(self):
  64. return self.title
  65. def __repr__(self):
  66. return "<Topic %r>" % self.title
  67. topics_collects = db.Table(
  68. 'topics_collects',
  69. db.Column('topics_id', db.Integer, db.ForeignKey('topics.id')),
  70. db.Column('collects_id', db.Integer, db.ForeignKey('collects.id')))
  71. collect_follow_users = db.Table(
  72. 'collects_follow_users',
  73. db.Column('collects_id', db.Integer, db.ForeignKey('collects.id')),
  74. db.Column('follow_users_id', db.Integer, db.ForeignKey('users.id')))
  75. class Collect(db.Model, ModelMixin):
  76. __tablename__ = 'collects'
  77. id = db.Column(db.Integer, primary_key=True)
  78. name = db.Column(db.String(32), nullable=False)
  79. description = db.Column(db.String(256), nullable=True)
  80. privacy = db.Column(db.Boolean, default=False)
  81. created_at = db.Column(
  82. db.DateTime, default=datetime.utcnow(), nullable=False)
  83. updated_at = db.Column(
  84. db.DateTime, default=datetime.utcnow(), onupdate=datetime.utcnow())
  85. author_id = db.Column(
  86. db.Integer, db.ForeignKey(
  87. 'users.id', ondelete="CASCADE"))
  88. author = db.relationship(
  89. User,
  90. backref=db.backref(
  91. 'collects', cascade='all,delete-orphan', lazy='dynamic'),
  92. lazy='joined')
  93. topics = db.relationship(
  94. Topic,
  95. secondary=topics_collects,
  96. backref=db.backref(
  97. 'collects', lazy='dynamic'),
  98. lazy='dynamic')
  99. followers = db.relationship(
  100. User,
  101. secondary=collect_follow_users,
  102. backref=db.backref(
  103. 'following_collects', lazy='dynamic'),
  104. lazy='dynamic')
  105. def __str__(self):
  106. return self.name
  107. def __repr__(self):
  108. return "<Collect %r>" % self.name
  109. replies_likers = db.Table(
  110. 'replies_likers',
  111. db.Column('replies_id', db.Integer, db.ForeignKey('replies.id')),
  112. db.Column('likers_id', db.Integer, db.ForeignKey('users.id')))
  113. class Reply(db.Model, ModelMixin):
  114. __tablename__ = 'replies'
  115. id = db.Column(db.Integer, primary_key=True)
  116. content = db.Column(db.Text, nullable=False)
  117. created_at = db.Column(
  118. db.DateTime, default=datetime.utcnow(), nullable=False)
  119. updated_at = db.Column(
  120. db.DateTime, default=datetime.utcnow(), onupdate=datetime.utcnow())
  121. topic_id = db.Column(
  122. db.Integer, db.ForeignKey(
  123. 'topics.id', ondelete="CASCADE"))
  124. topic = db.relationship(
  125. Topic,
  126. backref=db.backref(
  127. 'replies', cascade='all,delete-orphan', lazy='dynamic'),
  128. lazy='joined')
  129. author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
  130. author = db.relationship(
  131. User, backref=db.backref(
  132. 'replies', lazy='dynamic'), lazy='joined')
  133. likers = db.relationship(
  134. User,
  135. secondary=replies_likers,
  136. backref=db.backref(
  137. 'like_replies', lazy='dynamic'),
  138. lazy='dynamic')
  139. def __str__(self):
  140. return self.content[:10]
  141. def __repr__(self):
  142. return "<Topic %r>" % self.content[:10]