views.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  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-05-20 18:04:43 (CST)
  9. # Last Update:星期三 2016-6-15 19:6:23 (CST)
  10. # By:
  11. # Description:
  12. # **************************************************************************
  13. from flask import (Blueprint, render_template, request, redirect, url_for,
  14. jsonify)
  15. from flask.views import MethodView
  16. from flask_maple.forms import flash_errors
  17. from flask_login import current_user, login_required
  18. from flask_maple.forms import return_errors
  19. from maple import app, db
  20. from maple.main.permission import (follow_permission, collect_permission,
  21. like_permission)
  22. from maple.helpers import is_num
  23. from maple.topic.models import Topic, Collect
  24. from maple.mine.forms import CollectForm
  25. from .controls import CollectModel, FollowModel, LikeModel
  26. site = Blueprint('mine', __name__)
  27. class CollectAPI(MethodView):
  28. decorators = [collect_permission]
  29. def template_with_uid(self, topics, collect):
  30. form = CollectForm()
  31. form.name.data = collect.name
  32. form.description.data = collect.description
  33. form.is_privacy.data = 0 if collect.is_privacy else 1
  34. data = {'topics': topics, 'collect': collect, 'form': form}
  35. return render_template('mine/collect.html', **data)
  36. def template_without_uid(self, collects):
  37. form = CollectForm()
  38. data = {'collects': collects, 'form': form}
  39. return render_template('mine/collect_list.html', **data)
  40. def get(self, uid):
  41. page = is_num(request.args.get('page'))
  42. if uid is None:
  43. topics = current_user.collects.paginate(page,
  44. app.config['PER_PAGE'],
  45. error_out=True)
  46. return self.template_without_uid(topics)
  47. else:
  48. collect = Collect.query.filter_by(id=uid).first()
  49. topics = collect.topics.paginate(page, 10, True)
  50. return self.template_with_uid(topics, collect)
  51. def post(self):
  52. form = CollectForm()
  53. if form.validate_on_submit():
  54. CollectModel.post_data(form)
  55. return redirect(url_for('mine.collect'))
  56. else:
  57. if form.errors:
  58. flash_errors(form)
  59. return redirect(url_for('mine.collect'))
  60. def put(self, uid):
  61. form = CollectForm()
  62. if form.validate_on_submit():
  63. CollectModel.put_data(form, uid)
  64. return jsonify(judge=True)
  65. else:
  66. if form.errors:
  67. return return_errors(form)
  68. return jsonify(judge=False)
  69. def delete(self, uid):
  70. CollectModel.delete_data(uid)
  71. return jsonify(judge=True)
  72. @site.route('/collect/following')
  73. def collect_following():
  74. return redirect(url_for('mine.follow', type='collect'))
  75. @site.route('/add-to-collect', methods=['POST'])
  76. @login_required
  77. def add_collect():
  78. form = request.form.getlist('add-to-collect')
  79. topicId = request.args.get('topicId')
  80. topic = Topic.query.filter_by(uid=topicId).first_or_404()
  81. for id in form:
  82. collect = Collect.query.filter_by(id=id).first_or_404()
  83. collect.topics.append(topic)
  84. db.session.commit()
  85. return redirect(url_for('topic.topic', uid=topic.uid))
  86. class LikeAPI(MethodView):
  87. decorators = [like_permission]
  88. def post(self):
  89. data = request.get_json()
  90. uid = data['uid']
  91. LikeModel.post_data(uid)
  92. return jsonify(judge=True)
  93. def delete(self):
  94. data = request.get_json()
  95. uid = data['uid']
  96. LikeModel.delete_data(uid)
  97. return jsonify(judge=True)
  98. class FollowAPI(MethodView):
  99. decorators = [follow_permission]
  100. def template_without_uid(self, topics):
  101. return render_template('mine/follow_list.html', follows=topics)
  102. def get(self, type):
  103. # page = is_num(request.args.get('page'))
  104. if type == 'tag':
  105. return render_template('user/following_tag.html',
  106. following_type=type)
  107. elif type == 'user':
  108. return render_template('user/following_user.html',
  109. following_type=type)
  110. elif type == 'collect':
  111. return render_template('user/following_collect.html',
  112. following_type=type)
  113. else:
  114. return render_template('user/following_topic.html',
  115. following_type=type)
  116. def post(self):
  117. data = request.get_json()
  118. type = data['type']
  119. id = data['id']
  120. type_list = ['tag', 'topic', 'user', 'collect']
  121. if type in type_list:
  122. FollowModel.post_data(type, id)
  123. return jsonify(judge=True)
  124. else:
  125. pass
  126. return jsonify(judge=False)
  127. def delete(self):
  128. data = request.get_json()
  129. type = data['type']
  130. id = data['id']
  131. type_list = ['tag', 'topic', 'user', 'collect']
  132. if type in type_list:
  133. FollowModel.delete_data(type, id)
  134. return jsonify(judge=True)
  135. else:
  136. pass
  137. return jsonify(judge=False)
  138. def register_api(view, endpoint, url):
  139. view_func = view.as_view(endpoint)
  140. site.add_url_rule(url,
  141. defaults={'uid': None},
  142. view_func=view_func,
  143. methods=['GET', 'POST', 'DELETE'])
  144. def register_draft(view, endpoint, url):
  145. view_func = view.as_view(endpoint)
  146. site.add_url_rule(url,
  147. defaults={'uid': None},
  148. view_func=view_func,
  149. methods=['GET', 'POST'])
  150. site.add_url_rule('%s/<int:uid>' % url,
  151. view_func=view_func,
  152. methods=['GET', 'PUT', 'DELETE'])
  153. collect_view = CollectAPI.as_view('collect')
  154. site.add_url_rule('/collect',
  155. defaults={'uid': None},
  156. view_func=collect_view,
  157. methods=['GET', ])
  158. site.add_url_rule('/collect', view_func=collect_view, methods=['POST', ])
  159. site.add_url_rule('/collect/<uid>',
  160. view_func=collect_view,
  161. methods=['GET', 'PUT', 'DELETE'])
  162. follow_view = FollowAPI.as_view('follow')
  163. site.add_url_rule('/follow',
  164. defaults={'type': 'topics'},
  165. view_func=follow_view,
  166. methods=['GET', ])
  167. site.add_url_rule('/follow', view_func=follow_view, methods=['POST', 'DELETE'])
  168. site.add_url_rule('/follow/<type>', view_func=follow_view, methods=['GET'])
  169. like_view = LikeAPI.as_view('like')
  170. site.add_url_rule('/like', view_func=like_view, methods=['POST', 'DELETE'])