views.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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 13:47:04 (CST)
  9. # Last Update:星期三 2016-6-15 19:3:17 (CST)
  10. # By:
  11. # Description:
  12. # **************************************************************************
  13. from flask import (Blueprint, render_template, redirect, url_for, request)
  14. from flask.views import MethodView
  15. from flask_login import login_required
  16. from flask_maple.forms import flash_errors
  17. from maple import app
  18. from maple.main.models import RedisData
  19. from maple.main.permission import topic_permission, reply_permission
  20. from maple.helpers import is_num
  21. from maple.forums.models import Board
  22. from maple.topic.models import Topic
  23. from maple.topic.forms import TopicForm, ReplyForm
  24. from .controls import TopicModel, ReplyModel
  25. site = Blueprint('topic', __name__)
  26. @site.route('/ask')
  27. @login_required
  28. def ask():
  29. form = TopicForm()
  30. boardId = request.args.get('boardId')
  31. if boardId is not None:
  32. board = Board.query.filter_by(id=boardId).first()
  33. form.category.data = board.id
  34. return render_template('topic/ask.html', form=form)
  35. @site.route('/good')
  36. def good():
  37. page = is_num(request.args.get('page'))
  38. topics = Topic.query.filter_by(is_good=True).paginate(
  39. page, app.config['PER_PAGE'],
  40. error_out=True)
  41. return render_template('topic/topic_good.html', topics=topics)
  42. class TopicAPI(MethodView):
  43. decorators = [topic_permission]
  44. def template_with_uid(self, form, topic, replies):
  45. data = {'topic': topic, 'replies': replies, 'form': form}
  46. return render_template('topic/content.html', **data)
  47. def template_without_uid(self, topics):
  48. return render_template('topic/topic.html', topics=topics)
  49. def get(self, uid):
  50. page = is_num(request.args.get('page'))
  51. if uid is None:
  52. topics = Topic.query.paginate(page,
  53. app.config['PER_PAGE'],
  54. error_out=True)
  55. return self.template_without_uid(topics)
  56. else:
  57. form = ReplyForm()
  58. topic = Topic.query.filter_by(uid=str(uid)).first_or_404()
  59. replies = topic.replies.paginate(page, 5, True)
  60. RedisData.set_read_count(topic.id)
  61. return self.template_with_uid(form, topic, replies)
  62. def post(self):
  63. form = TopicForm()
  64. if form.validate_on_submit():
  65. topic = TopicModel.post_data(form)
  66. return redirect(url_for('topic.topic', uid=topic.uid))
  67. else:
  68. if form.errors:
  69. flash_errors(form)
  70. form.title.data = form.title.data
  71. else:
  72. pass
  73. form.title.data = form.title.data
  74. return redirect(url_for('topic.ask'))
  75. # def put(self, uid):
  76. # form = TopicForm()
  77. # if form.validate_on_submit():
  78. # pass
  79. # def delete(self, uid):
  80. # return 'delete'
  81. class ReplyAPI(MethodView):
  82. decorators = [reply_permission]
  83. def post(self, uid):
  84. form = ReplyForm()
  85. topic = Topic.query.filter_by(id=uid).first()
  86. if form.validate_on_submit():
  87. ReplyModel.post_data(form, uid)
  88. return redirect(url_for('topic.topic', uid=topic.uid))
  89. else:
  90. if form.errors:
  91. flash_errors(form)
  92. else:
  93. pass
  94. return redirect(url_for('topic.topic',
  95. uid=str(topic.uid),
  96. _anchor='reply'))
  97. # def put(self, uid):
  98. # return 'put'
  99. # def delete(self, uid):
  100. # return 'delete'
  101. topic_view = TopicAPI.as_view('topic')
  102. site.add_url_rule('',
  103. defaults={'uid': None},
  104. view_func=topic_view,
  105. methods=['GET'])
  106. site.add_url_rule('', view_func=TopicAPI.as_view('post'), methods=['POST'])
  107. site.add_url_rule('/<uid>', view_func=topic_view, methods=['GET'])
  108. site.add_url_rule('/reply/<uid>',
  109. view_func=ReplyAPI.as_view('reply'),
  110. methods=['POST'])