123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # **************************************************************************
- # Copyright © 2016 jianglin
- # File Name: views.py
- # Author: jianglin
- # Email: xiyang0807@gmail.com
- # Created: 2016-12-15 22:07:39 (CST)
- # Last Update:星期二 2017-3-28 22:24:9 (CST)
- # By:
- # Description:
- # **************************************************************************
- from flask import redirect, render_template, request, url_for, Markup
- from flask_babelex import gettext as _
- from flask_login import current_user, login_required
- from flask_maple.auth.forms import form_validate
- from flask_maple.response import HTTPResponse
- from forums.api.forums.models import Board
- from forums.api.tag.models import Tags
- from forums.common.serializer import Serializer
- from forums.common.utils import gen_filter_dict, gen_order_by
- from forums.common.views import BaseMethodView as MethodView
- from forums.filters import safe_markdown
- from forums.api.forms import (CollectForm, ReplyForm, TopicForm,
- collect_error_callback, error_callback,
- form_board)
- from .models import Reply, Topic
- class TopicAskView(MethodView):
- def get(self):
- boardId = request.args.get('boardId', type=int)
- form = form_board()
- if boardId is not None:
- form.category.data = boardId
- data = {'title': _('Ask - '), 'form': form}
- return render_template('topic/ask.html', **data)
- class TopicEditView(MethodView):
- def get(self, topicId):
- topic = Topic.query.filter_by(id=topicId).first_or_404()
- form = form_board()
- form.title.data = topic.title
- form.category.data = topic.board_id
- form.tags.data = ','.join([tag.name for tag in topic.tags])
- form.content.data = topic.content
- data = {'title': _('Edit -'), 'form': form, 'topic': topic}
- return render_template('topic/edit.html', **data)
- class TopicPreviewView(MethodView):
- @login_required
- def post(self):
- post_data = request.data
- content_type = post_data.pop('content_type', None)
- content = post_data.pop('content', None)
- if content_type == Topic.CONTENT_TYPE_MARKDOWN:
- return safe_markdown(content)
- return content
- class TopicListView(MethodView):
- def get(self):
- query_dict = request.data
- page, number = self.page_info
- keys = ['title']
- order_by = gen_order_by(query_dict, keys)
- filter_dict = gen_filter_dict(query_dict, keys)
- if request.path.endswith('good'):
- filter_dict.update(is_good=True)
- elif request.path.endswith('top'):
- filter_dict.update(is_top=True)
- topics = Topic.query.filter_by(
- **filter_dict).order_by(*order_by).paginate(page, number, True)
- return render_template('topic/topic_list.html', topics=topics)
- @form_validate(form_board, error=error_callback, f='')
- def post(self):
- form = form_board()
- post_data = form.data
- title = post_data.pop('title', None)
- content = post_data.pop('content', None)
- tags = post_data.pop('tags', None)
- content_type = post_data.pop('content_type', None)
- board = post_data.pop('category', None)
- topic = Topic(
- title=title,
- content=content,
- content_type=content_type,
- board_id=int(board))
- tags = tags.split(',')
- topic_tags = []
- for tag in tags:
- topic_tag = Tags.query.filter_by(name=tag).first()
- if topic_tag is None:
- topic_tag = Tags(name=tag, description=tag)
- topic_tag.save()
- topic_tags.append(topic_tag)
- topic.tags = topic_tags
- topic.author = current_user
- topic.save()
- return redirect(url_for('topic.topic', topicId=topic.id))
- class TopicView(MethodView):
- def get(self, topicId):
- form = ReplyForm()
- topic = Topic.query.filter_by(id=topicId).first_or_404()
- data = {'title': topic.title, 'form': form, 'topic': topic}
- return render_template('topic/topic.html', **data)
- # def put(self, topicId):
- # post_data = request.data
- # topic = Topic.query.filter_by(id=topicId).first_or_404()
- # title = post_data.pop('title', None)
- # content = post_data.pop('content', None)
- # content_type = post_data.pop('content_type', None)
- # board = post_data.pop('board', None)
- # if title is not None:
- # topic.title = title
- # if content is not None:
- # topic.content = content
- # if content_type is not None:
- # topic.content_type = content_type
- # if board is not None:
- # topic.board = int(board)
- # topic.save()
- # return redirect(url_for('topic.topic', topicId=topic.id))
- class ReplyListView(MethodView):
- @form_validate(ReplyForm, error=error_callback, f='')
- def post(self, topicId):
- topic = Topic.query.filter_by(id=topicId).first_or_404()
- post_data = request.data
- content = post_data.pop('content', None)
- reply = Reply(content=content, topic_id=topic.id)
- reply.author = current_user
- reply.save()
- return redirect(url_for('topic.topic', topicId=topic.id))
- class ReplyView(MethodView):
- def put(self, replyId):
- post_data = request.data
- reply = Reply.query.filter_by(id=replyId).first()
- content = post_data.pop('content', None)
- if content is not None:
- reply.content = content
- reply.save()
- serializer = Serializer(reply, many=False)
- return HTTPResponse(HTTPResponse.NORMAL_STATUS,
- **serializer.data).to_response()
- def delete(self, replyId):
- reply = Reply.query.filter_by(id=replyId).first()
- reply.delete()
- serializer = Serializer(reply, many=False)
- return HTTPResponse(HTTPResponse.NORMAL_STATUS,
- **serializer.data).to_response()
- class LikeView(MethodView):
- def post(self, replyId):
- user = request.user
- reply = Reply.query.filter_by(id=replyId).first_or_404()
- reply.likers.append(user)
- reply.save()
- serializer = Serializer(reply, many=False)
- return HTTPResponse(
- HTTPResponse.NORMAL_STATUS, data=serializer.data).to_response()
- def delete(self, replyId):
- user = request.user
- reply = Reply.query.filter_by(id=replyId).first_or_404()
- reply.likers.remove(user)
- reply.save()
- serializer = Serializer(reply, many=False)
- return HTTPResponse(
- HTTPResponse.NORMAL_STATUS, data=serializer.data).to_response()
|