views.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # **************************************************************************
  4. # Copyright © 2016 jianglin
  5. # File Name: views.py
  6. # Author: jianglin
  7. # Email: xiyang0807@gmail.com
  8. # Created: 2016-12-15 22:07:39 (CST)
  9. # Last Update:星期六 2017-3-25 22:47:59 (CST)
  10. # By:
  11. # Description:
  12. # **************************************************************************
  13. from flask import redirect, render_template, request, url_for
  14. from flask_babelex import gettext as _
  15. from flask_login import current_user
  16. from flask_maple.auth.forms import form_validate
  17. from flask_maple.response import HTTPResponse
  18. from forums.api.forums.models import Board
  19. from forums.api.tag.models import Tags
  20. from forums.common.serializer import Serializer
  21. from forums.common.views import BaseMethodView as MethodView
  22. from forums.common.utils import (gen_filter_dict, gen_order_by)
  23. from .forms import (CollectForm, ReplyForm, TopicForm, collect_error_callback,
  24. error_callback, form_board)
  25. from .models import Collect, Topic, Reply
  26. class TopicAskView(MethodView):
  27. def get(self):
  28. boardId = request.args.get('boardId', type=int)
  29. form = form_board()
  30. if boardId is not None:
  31. form.category.data = boardId
  32. data = {'title': _('Ask - '), 'form': form}
  33. return render_template('topic/ask.html', **data)
  34. class TopicEditView(MethodView):
  35. def get(self, topicId):
  36. topic = Topic.query.filter_by(id=topicId).first_or_404()
  37. form = form_board()
  38. form.title.data = topic.title
  39. form.category.data = topic.board_id
  40. form.tags.data = ','.join([tag.name for tag in topic.tags])
  41. form.content.data = topic.content
  42. data = {'title': _('Edit -'), 'form': form, 'topic': topic}
  43. return render_template('topic/edit.html', **data)
  44. class TopicPreviewView(MethodView):
  45. def post(self):
  46. choice = request.values.get('choice')
  47. content = request.values.get('content')
  48. return
  49. class TopicListView(MethodView):
  50. def get(self):
  51. query_dict = request.data
  52. page, number = self.page_info
  53. keys = ['title']
  54. order_by = gen_order_by(query_dict, keys)
  55. filter_dict = gen_filter_dict(query_dict, keys)
  56. if request.path.endswith('good'):
  57. filter_dict.update(is_good=True)
  58. elif request.path.endswith('top'):
  59. filter_dict.update(is_top=True)
  60. topics = Topic.query.filter_by(
  61. **filter_dict).order_by(*order_by).paginate(page, number, True)
  62. return render_template('topic/topic_list.html', topics=topics)
  63. @form_validate(form_board, error=error_callback, f='')
  64. def post(self):
  65. form = form_board()
  66. post_data = form.data
  67. title = post_data.pop('title', None)
  68. content = post_data.pop('content', None)
  69. tags = post_data.pop('tags', None)
  70. content_type = post_data.pop('content_type', None)
  71. board = post_data.pop('category', None)
  72. topic = Topic(
  73. title=title,
  74. content=content,
  75. content_type=content_type,
  76. board_id=int(board))
  77. tags = tags.split(',')
  78. topic_tags = []
  79. for tag in tags:
  80. topic_tag = Tags.query.filter_by(name=tag).first()
  81. if topic_tag is None:
  82. topic_tag = Tags()
  83. topic_tag.name = tag
  84. topic_tag.description = tag
  85. topic_tag.save()
  86. topic_tags.append(topic_tag)
  87. topic.tags = topic_tags
  88. topic.author = current_user
  89. topic.save()
  90. return redirect(url_for('topic.topic', topicId=topic.id))
  91. class TopicView(MethodView):
  92. def get(self, topicId):
  93. form = ReplyForm()
  94. topic = Topic.query.filter_by(id=topicId).first_or_404()
  95. data = {'title': topic.title, 'form': form, 'topic': topic}
  96. return render_template('topic/topic.html', **data)
  97. def put(self, topicId):
  98. post_data = request.data
  99. topic = Topic.query.filter_by(id=topicId).first()
  100. title = post_data.pop('title', None)
  101. content = post_data.pop('content', None)
  102. content_type = post_data.pop('content_type', None)
  103. board = post_data.pop('board', None)
  104. if title is not None:
  105. topic.title = title
  106. if content is not None:
  107. topic.content = content
  108. if content_type is not None:
  109. topic.content_type = content_type
  110. if board is not None:
  111. topic.board = int(board)
  112. topic.save()
  113. return redirect(url_for('topic.topic', topicId=topic.id))
  114. # def delete(self, topicId):
  115. # topic = Topic.query.filter_by(id=topicId).first()
  116. # topic.delete()
  117. # serializer = Serializer(topic, many=False)
  118. # return HTTPResponse(HTTPResponse.NORMAL_STATUS,
  119. # **serializer.data).to_response()
  120. class CollectListView(MethodView):
  121. def get(self):
  122. form = CollectForm()
  123. page, number = self.page_info
  124. collects = Collect.get_list(page, number)
  125. data = {'collects': collects, 'form': form}
  126. return render_template('collect/collect_list.html', **data)
  127. @form_validate(CollectForm, error=collect_error_callback, f='')
  128. def post(self):
  129. form = CollectForm()
  130. post_data = form.data
  131. name = post_data.pop('name', None)
  132. description = post_data.pop('description', None)
  133. privacy = post_data.pop('private', None)
  134. privacy = True if privacy == '0' else False
  135. collect = Collect(name=name, description=description, privacy=privacy)
  136. collect.author = current_user
  137. collect.save()
  138. return collect_error_callback()
  139. class CollectView(MethodView):
  140. def get(self, collectId):
  141. form = CollectForm()
  142. collect = Collect.get(id=collectId)
  143. topics = collect.topics.paginate(1, 23, True)
  144. data = {'collect': collect, 'topics': topics, 'form': form}
  145. return render_template('collect/collect.html', **data)
  146. def put(self, collectId):
  147. post_data = request.data
  148. collect = Collect.query.filter_by(id=collectId).first()
  149. name = post_data.pop('name', None)
  150. description = post_data.pop('description', None)
  151. privacy = post_data.pop('privacy', None)
  152. if name is not None:
  153. collect.name = name
  154. if description is not None:
  155. collect.description = description
  156. if privacy is not None:
  157. collect.privacy = privacy
  158. collect.save()
  159. serializer = Serializer(collect, many=False)
  160. return HTTPResponse(HTTPResponse.NORMAL_STATUS,
  161. **serializer.data).to_response()
  162. def delete(self, collectId):
  163. collect = Collect.query.filter_by(id=collectId).first()
  164. collect.delete()
  165. serializer = Serializer(collect, many=False)
  166. return HTTPResponse(HTTPResponse.NORMAL_STATUS,
  167. **serializer.data).to_response()
  168. class ReplyListView(MethodView):
  169. @form_validate(ReplyForm, error=error_callback, f='')
  170. def post(self, topicId):
  171. topic = Topic.query.filter_by(id=topicId).first_or_404()
  172. post_data = request.data
  173. content = post_data.pop('content', None)
  174. reply = Reply(content=content, topic_id=topic.id)
  175. reply.author = current_user
  176. reply.save()
  177. return redirect(url_for('topic.topic', topicId=topic.id))
  178. class ReplyView(MethodView):
  179. def put(self, replyId):
  180. post_data = request.data
  181. reply = Reply.query.filter_by(id=replyId).first()
  182. content = post_data.pop('content', None)
  183. if content is not None:
  184. reply.content = content
  185. reply.save()
  186. serializer = Serializer(reply, many=False)
  187. return HTTPResponse(HTTPResponse.NORMAL_STATUS,
  188. **serializer.data).to_response()
  189. def delete(self, replyId):
  190. reply = Reply.query.filter_by(id=replyId).first()
  191. reply.delete()
  192. serializer = Serializer(reply, many=False)
  193. return HTTPResponse(HTTPResponse.NORMAL_STATUS,
  194. **serializer.data).to_response()
  195. class LikeView(MethodView):
  196. def post(self, replyId):
  197. user = request.user
  198. reply = Reply.query.filter_by(id=replyId).first_or_404()
  199. reply.likers.append(user)
  200. reply.save()
  201. serializer = Serializer(reply, many=False)
  202. return HTTPResponse(
  203. HTTPResponse.NORMAL_STATUS, data=serializer.data).to_response()
  204. def delete(self, replyId):
  205. user = request.user
  206. reply = Reply.query.filter_by(id=replyId).first_or_404()
  207. reply.likers.remove(user)
  208. reply.save()
  209. serializer = Serializer(reply, many=False)
  210. return HTTPResponse(
  211. HTTPResponse.NORMAL_STATUS, data=serializer.data).to_response()