models.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # **************************************************************************
  4. # Copyright © 2017 jianglin
  5. # File Name: models.py
  6. # Author: jianglin
  7. # Email: xiyang0807@gmail.com
  8. # Created: 2017-04-01 18:33:37 (CST)
  9. # Last Update:星期六 2017-4-1 20:49:46 (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.filters import safe_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('users.id'))
  42. sender = db.relationship(
  43. 'User',
  44. backref=db.backref(
  45. 'send_messages', lazy='dynamic'),
  46. lazy='joined',
  47. uselist=False)
  48. @classmethod
  49. def get_choice_dict(cls):
  50. return dict(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(
  79. "messages", cascade='all,delete', lazy='dynamic'),
  80. uselist=False,
  81. lazy='joined')
  82. receiver_id = db.Column(db.Integer, db.ForeignKey('users.id'))
  83. receiver = db.relationship(
  84. 'User',
  85. backref=db.backref(
  86. 'receive_messages', lazy='dynamic'),
  87. lazy='joined',
  88. uselist=False)
  89. def __str__(self):
  90. return self.status
  91. def __repr__(self):
  92. return "<Message %r>" % self.status
  93. @property
  94. def title(self):
  95. return safe_markdown(self.message_text.title)
  96. # return self.message_text.title
  97. @property
  98. def content(self):
  99. return self.message_text.content
  100. @classmethod
  101. def get_choice_dict(cls):
  102. return dict(message=dict(status=dict(cls.STATUS)))
  103. class MessageClient(object):
  104. def system():
  105. '''
  106. 系统消息
  107. '''
  108. @classmethod
  109. def topic(cls, reply, sender=None):
  110. '''
  111. 回复主题
  112. '''
  113. if sender is None:
  114. sender = current_user
  115. topic = reply.topic
  116. receiver = topic.author
  117. if sender.id == receiver.id:
  118. return
  119. title = '[{}]({})回复了你创建的主题:[{}]({})'.format(
  120. sender.username,
  121. url_for(
  122. 'user.user', username=sender.username),
  123. topic.title,
  124. url_for(
  125. 'topic.topic', topicId=topic.id))
  126. content = reply.content
  127. message_text = MessageText(
  128. sender_id=sender.id, title=title, content=content)
  129. message_text.save()
  130. message = Message(receiver=receiver, message_text=message_text)
  131. message.save()
  132. receiver.message_count = 1
  133. @classmethod
  134. def collect(cls, topic, sender=None):
  135. '''
  136. 收藏
  137. '''
  138. if sender is None:
  139. sender = current_user
  140. receiver = topic.author
  141. if sender.id == receiver.id:
  142. return
  143. title = '[{}]({})收藏了你创建的主题:[{}]({})'.format(
  144. sender.username,
  145. url_for(
  146. 'user.user', username=sender.username),
  147. topic.title,
  148. url_for(
  149. 'topic.topic', topicId=topic.id))
  150. content = 'a'
  151. message_text = MessageText(
  152. sender_id=sender.id, title=title, content=content)
  153. message_text.save()
  154. message = Message(receiver=receiver, message_text=message_text)
  155. message.save()
  156. receiver.message_count = 1
  157. @classmethod
  158. def follow(cls, following, sender=None):
  159. '''
  160. 关注用户,关注主题,关注收藏
  161. '''
  162. if sender is None:
  163. sender = current_user
  164. if following.__class__.__name__ == 'Topic':
  165. receiver = following.author
  166. title = '[{}]({})关注了你创建的主题:[{}]({})'.format(
  167. sender.username,
  168. url_for(
  169. 'user.user', username=sender.username),
  170. following.title,
  171. url_for(
  172. 'topic.topic', topicId=following.id))
  173. elif following.__class__.__name__ == 'Collect':
  174. receiver = following.author
  175. title = '[{}]({})关注了你创建的收藏:[{}]({})'.format(
  176. sender.username,
  177. url_for(
  178. 'user.user', username=sender.username),
  179. following.title,
  180. url_for(
  181. 'collect.collect', pk=following.id))
  182. elif following.__class__.__name__ == 'User':
  183. receiver = following
  184. title = '[{}]({})关注了你'.format(
  185. sender.username,
  186. url_for(
  187. 'user.user', username=sender.username))
  188. if sender.id == receiver.id:
  189. return
  190. content = 'a'
  191. message_text = MessageText(
  192. sender_id=sender.id, title=title, content=content)
  193. message_text.save()
  194. message = Message(receiver=receiver, message_text=message_text)
  195. message.save()
  196. receiver.message_count = 1
  197. @classmethod
  198. def reply(cls, reply, sender=None):
  199. '''
  200. 子回复
  201. '''
  202. if sender is None:
  203. sender = current_user
  204. receiver = reply.author
  205. if sender.id == receiver.id:
  206. return
  207. topic = reply.topic
  208. title = '[{}]({})在[{}]({})回复了你'.format(
  209. sender.username,
  210. url_for(
  211. 'user.user', username=sender.username),
  212. topic.title,
  213. url_for(
  214. 'topic.topic', topicId=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. @classmethod
  223. def like(cls, reply, sender=None):
  224. '''
  225. 点赞
  226. '''
  227. if sender is None:
  228. sender = current_user
  229. receiver = reply.author
  230. if sender.id == receiver.id:
  231. return
  232. topic = reply.topic
  233. title = '[{}]({})在[{}]({})赞了你的回复'.format(
  234. sender.username,
  235. url_for(
  236. 'user.user', username=sender.username),
  237. topic.title,
  238. url_for(
  239. 'topic.topic', topicId=topic.id))
  240. content = reply.content
  241. message_text = MessageText(
  242. sender_id=sender.id, title=title, content=content)
  243. message_text.save()
  244. message = Message(receiver=receiver, message_text=message_text)
  245. message.save()
  246. receiver.message_count = 1
  247. def private(cls, message, sender=None):
  248. '''
  249. 私信
  250. '''