db.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # **************************************************************************
  4. # Copyright © 2017 jianglin
  5. # File Name: db.py
  6. # Author: jianglin
  7. # Email: xiyang0807@gmail.com
  8. # Created: 2017-04-01 18:33:37 (CST)
  9. # Last Update: Wednesday 2019-05-08 15:09:17 (CST)
  10. # By:
  11. # Description:
  12. # **************************************************************************
  13. from flask import url_for
  14. from flask_login import current_user
  15. from forums.extension import db
  16. from forums.jinja import markdown
  17. from forums.common.models import CommonTimeMixin
  18. class MessageText(CommonTimeMixin, db.Model):
  19. __tablename__ = 'message_text'
  20. MESSAGE_TYPE_PUBLIC = '0'
  21. MESSAGE_TYPE_TOPIC = '1'
  22. MESSAGE_TYPE_REPLY = '2'
  23. MESSAGE_TYPE_PRIVATE = '3'
  24. MESSAGE_TYPE = (('0', '系统消息'), ('1', '主题相关'), ('2', '回复相关'), ('3', '私信'))
  25. STATUS_SUBMIT = '0'
  26. STATUS_PUBLISH = '1'
  27. STATUS_UNDO = '2'
  28. STATUS = (('0', '未发布'), ('1', '已发布'), ('2', '撤销发布'))
  29. READ_STATUS_UNREAD = '0'
  30. READ_STATUS_READ = '1'
  31. READ_STATUS = (('0', '未读'), ('1', '已读'))
  32. title = db.Column(db.String(128), nullable=False, doc='站内信标题')
  33. content = db.Column(db.String(1024), nullable=False, doc='站内信内容')
  34. status = db.Column(
  35. db.String(128), nullable=False, default=STATUS_SUBMIT, doc='站内信状态')
  36. message_type = db.Column(
  37. db.String(128),
  38. nullable=False,
  39. default=MESSAGE_TYPE_PUBLIC,
  40. doc='站内信类型')
  41. sender_id = db.Column(db.Integer, db.ForeignKey('user.id'))
  42. sender = db.relationship(
  43. 'User',
  44. backref=db.backref('send_messages', lazy='dynamic'),
  45. lazy='joined',
  46. uselist=False)
  47. @classmethod
  48. def get_choice_dict(cls):
  49. return dict(
  50. messagetext=dict(
  51. status=dict(cls.STATUS),
  52. message_type=dict(cls.MESSAGE_TYPE),
  53. read_status=dict(cls.READ_STATUS)))
  54. def __str__(self):
  55. return self.title
  56. def __repr__(self):
  57. return "<MessageText %r>" % self.title
  58. @property
  59. def read_status(self):
  60. '''
  61. 判断站内信是否已读
  62. '''
  63. message = Message.query.filter_by(message_text_id=self.id).first()
  64. if message:
  65. return '已读' if message.status == Message.STATUS_READ else '已删除'
  66. return '未读'
  67. class Message(CommonTimeMixin, db.Model):
  68. __tablename__ = 'message'
  69. STATUS_UNREAD = '0'
  70. STATUS_READ = '1'
  71. STATUS_DELETE = '2'
  72. STATUS = (('0', '未读'), ('1', '已读'), ('2', '删除'))
  73. status = db.Column(
  74. db.String(128), nullable=False, default=STATUS_UNREAD, doc='站内信状态')
  75. message_text_id = db.Column(db.Integer, db.ForeignKey('message_text.id'))
  76. message_text = db.relationship(
  77. MessageText,
  78. backref=db.backref("messages", cascade='all,delete', lazy='dynamic'),
  79. uselist=False,
  80. lazy='joined')
  81. receiver_id = db.Column(db.Integer, db.ForeignKey('user.id'))
  82. receiver = db.relationship(
  83. 'User',
  84. backref=db.backref('receive_messages', lazy='dynamic'),
  85. lazy='joined',
  86. uselist=False)
  87. def __str__(self):
  88. return self.status
  89. def __repr__(self):
  90. return "<Message %r>" % self.status
  91. @property
  92. def title(self):
  93. return markdown(self.message_text.title)
  94. # return self.message_text.title
  95. @property
  96. def content(self):
  97. return self.message_text.content
  98. @classmethod
  99. def get_choice_dict(cls):
  100. return dict(message=dict(status=dict(cls.STATUS)))
  101. class MessageClient(object):
  102. def system():
  103. '''
  104. 系统消息
  105. '''
  106. @classmethod
  107. def topic(cls, reply, sender=None):
  108. '''
  109. 回复主题
  110. '''
  111. if sender is None:
  112. sender = current_user
  113. topic = reply.topic
  114. receiver = topic.author
  115. if sender.id == receiver.id:
  116. return
  117. title = '[{}]({})回复了你创建的主题:[{}]({})'.format(
  118. sender.username, url_for('user.user', username=sender.username),
  119. topic.title, url_for('topic.topic', pk=topic.id))
  120. content = reply.content
  121. message_text = MessageText(
  122. sender_id=sender.id, title=title, content=content)
  123. message_text.save()
  124. message = Message(receiver=receiver, message_text=message_text)
  125. message.save()
  126. receiver.message_count = 1
  127. @classmethod
  128. def collect(cls, topic, sender=None):
  129. '''
  130. 收藏
  131. '''
  132. if sender is None:
  133. sender = current_user
  134. receiver = topic.author
  135. if sender.id == receiver.id:
  136. return
  137. title = '[{}]({})收藏了你创建的主题:[{}]({})'.format(
  138. sender.username, url_for('user.user', username=sender.username),
  139. topic.title, url_for('topic.topic', pk=topic.id))
  140. content = 'a'
  141. message_text = MessageText(
  142. sender_id=sender.id, title=title, content=content)
  143. message_text.save()
  144. message = Message(receiver=receiver, message_text=message_text)
  145. message.save()
  146. receiver.message_count = 1
  147. @classmethod
  148. def follow(cls, following, sender=None):
  149. '''
  150. 关注用户,关注主题,关注收藏
  151. '''
  152. if sender is None:
  153. sender = current_user
  154. if following.__class__.__name__ == 'Topic':
  155. receiver = following.author
  156. title = '[{}]({})关注了你创建的主题:[{}]({})'.format(
  157. sender.username, url_for(
  158. 'user.user', username=sender.username), following.title,
  159. url_for('topic.topic', pk=following.id))
  160. elif following.__class__.__name__ == 'Collect':
  161. receiver = following.author
  162. title = '[{}]({})关注了你创建的收藏:[{}]({})'.format(
  163. sender.username, url_for(
  164. 'user.user', username=sender.username), following.title,
  165. url_for('collect.collect', pk=following.id))
  166. elif following.__class__.__name__ == 'User':
  167. receiver = following
  168. title = '[{}]({})关注了你'.format(
  169. sender.username, url_for(
  170. 'user.user', username=sender.username))
  171. if sender.id == receiver.id:
  172. return
  173. content = 'a'
  174. message_text = MessageText(
  175. sender_id=sender.id, title=title, content=content)
  176. message_text.save()
  177. message = Message(receiver=receiver, message_text=message_text)
  178. message.save()
  179. receiver.message_count = 1
  180. @classmethod
  181. def reply(cls, reply, sender=None):
  182. '''
  183. 子回复
  184. '''
  185. if sender is None:
  186. sender = current_user
  187. receiver = reply.author
  188. if sender.id == receiver.id:
  189. return
  190. topic = reply.topic
  191. title = '[{}]({})在[{}]({})回复了你'.format(
  192. sender.username, url_for('user.user', username=sender.username),
  193. topic.title, url_for('topic.topic', pk=topic.id))
  194. content = reply.content
  195. message_text = MessageText(
  196. sender_id=sender.id, title=title, content=content)
  197. message_text.save()
  198. message = Message(receiver=receiver, message_text=message_text)
  199. message.save()
  200. receiver.message_count = 1
  201. @classmethod
  202. def like(cls, reply, sender=None):
  203. '''
  204. 点赞
  205. '''
  206. if sender is None:
  207. sender = current_user
  208. receiver = reply.author
  209. if sender.id == receiver.id:
  210. return
  211. topic = reply.topic
  212. title = '[{}]({})在[{}]({})赞了你的回复'.format(
  213. sender.username, url_for('user.user', username=sender.username),
  214. topic.title, url_for('topic.topic', pk=topic.id))
  215. content = reply.content
  216. message_text = MessageText(
  217. sender_id=sender.id, title=title, content=content)
  218. message_text.save()
  219. message = Message(receiver=receiver, message_text=message_text)
  220. message.save()
  221. receiver.message_count = 1
  222. def private(cls, message, sender=None):
  223. '''
  224. 私信
  225. '''