def manage_settings(): form = BlogSettingForm() admin = Admin.query.first() if form.validate_on_submit(): with db.auto_commit(): admin.set_attrs(form.data) db.session.add(admin) index_image = form.blog_index_image.data if index_image: upload_file(index_image, 'index_image') nav_image = form.blog_nav_image.data if nav_image: upload_file(nav_image, 'nav_image') favicon = form.blog_favicon.data if favicon: upload_file(favicon, 'favicon') flash('博客设置成功', 'success') return redirect_back() form.blog_title.data = admin.blog_title form.blog_sub_title.data = admin.blog_sub_title form.name.data = admin.name form.about.data = admin.about form.theme.data = admin.theme form.blog_index_image_url.data = admin.blog_index_image_url form.blog_description.data = admin.blog_description return render_template('admin/manage_settings.html', form=form)
def delete_category(category_id): """删除分类视图""" if category_id == 1: abort(404) category = Category.query.get_or_404(category_id) category.delete() return redirect_back()
def blog_setting(): """Blog设置视图""" form = AdminForm(request.form) admin = Admin.query.first() if form.validate_on_submit(): form.blog_about.data = request.form['markdownEditor-html-code'] with db.auto_commit(): admin.set_attr(form.data) db.session.add(admin) flash('Blog设置更新成功。', 'success') redirect_back() if not form.errors: form.blog_title.data = admin.blog_title form.blog_subtitle.data = admin.blog_subtitle form.nickname.data = admin.nickname form.email.data = admin.email form.post_per_page.data = admin.post_per_page form.comment_per_page.data = admin.comment_per_page form.blog_about_markdown.data = admin.blog_about_markdown return render_template('admin/blog_setting.html', form=form)
def delete_record(model_name, record_id, action): """ 删除文章或评论视图 :param model_name: 数据表模型名称,model_name = Comment or Post :param record_id: 记录 id :param action: 执行操作 action = all 删除全部回收站评论 """ model = current_app.config['MODELS'].get(model_name) if action == 'all': with db.auto_commit(): for record in model.query.filter_by(trash=True).all(): db.session.delete(record) flash('回收站已清空', 'success') return redirect_back(default_endpoint='web.manage_comment') record = model.query.get_or_404(record_id) with db.auto_commit(): db.session.delete(record) flash_message = '评论已删除' if model_name == 'Comment' else '文章已删除' flash(flash_message, 'success') return redirect_back()
def search(): """搜索视图""" admin = Admin.query.first() per_page = admin.post_per_page search_str = request.args.get('search').strip() if not search_str: flash('搜索内容不能为空。', 'warning') return redirect_back() if len(search_str) < 2: flash('搜索内容不能少于两个字符。', 'warning') return redirect_back() pagination = Post.query.whooshee_search(search_str).order_by( Post.create_time.desc()).paginate(per_page=per_page) if pagination.total == 0: flash(f'没有搜索到任何包含 {search_str} 的结果。', 'warning') return redirect_back() return render_template('blog/search.html', search_str=search_str, pagination=pagination)
def manage_link(): """后台链接管理管理视图""" form = NewLinkForm(request.form) if form.validate_on_submit(): with db.auto_commit(): link = Link() link.set_attr(form.data) db.session.add(link) return redirect_back() fields_names, fields_errors = get_form_error_items(form) return render_template('admin/manage_link.html', form=form, fields_errors=fields_errors, fields_names=fields_names)
def manage_category(): """后台分类管理视图""" form = NewCategoryForm(request.form) if form.validate_on_submit(): with db.auto_commit(): category = Category() category.set_attr(form.data) db.session.add(category) return redirect_back() fields_names, fields_errors = get_form_error_items(form) return render_template('admin/manage_category.html', form=form, fields_errors=fields_errors, fields_names=fields_names)
def close_comment(post_id, action): """ 关闭文章评论视图 :param post_id: 文章 id :param action: 执行操作,action = do or undo """ post = Post.query.get_or_404(post_id) if action == 'do': post.can_comment = True flash_message = f'文章 "{post.title}" 评论功能已开启' else: post.can_comment = False flash_message = f'文章 "{post.title}" 评论功能已关闭' with db.auto_commit(): db.session.add(post) flash(flash_message, 'success') return redirect_back()
def review_comment(comment_id, action): """ 审核评论视图,可执行审核以及撤销审核操作 :param comment_id: 评论 id :param action: 执行方式 action = do or undo """ comment = Comment.query.get_or_404(comment_id) if action == 'do': comment.reviewed = True flash_message = '评论审核成功' else: comment.reviewed = False flash_message = '撤销评论审核成功' with db.auto_commit(): db.session.add(comment) flash(flash_message, 'success') return redirect_back()
def login(): if current_user.is_authenticated: return redirect(url_for('web.index')) form = LoginForm() if form.validate_on_submit(): username = form.username.data password = form.password.data remember = form.remember.data admin = Admin.query.first() if admin: if username == admin.username and admin.check_password(password): login_user(admin, remember) flash('欢迎回来 %s' % admin.name, 'success') return redirect_back() flash('用户名或密码错误', 'warning') else: flash('管理账户不存在', 'warning') return render_template('auth/login.html', form=form)
def search(): q = request.args.get('q', '').strip() if q == '': flash('搜索内容不能为空', 'warning') return redirect_back() page = request.args.get('page', 1, type=int) per_page = current_app.config['BLOG_SEARCH_PER_PAGE'] pagination = Post.query.whooshee_search(q).order_by( Post.timestamp.desc()).paginate(page, per_page) results = pagination.items if not results: flash('没有搜索到任何包含 “%s” 的结果' % q, 'warning') return render_template('blog/search.html', q=q, results=results, pagination=pagination)
def trash_record(model_name, record_id, action): """ 移动评论或文章至回收站视图,软删除 :param model_name: 数据表模型名称,model_name = Comment or Post :param record_id: 记录 id :param action: 执行方式 action = do or undo """ model = current_app.config['MODELS'].get(model_name) record = model.query.get_or_404(record_id) if action == 'do': record.trash = True flash_message = '评论已被移入回收站' if model_name == 'Comment' else '文章已被移入回收站' else: record.trash = False flash_message = '评论已被移出回收站' if model_name == 'Comment' else '文章已被移出回收站' with db.auto_commit(): db.session.add(record) flash(flash_message, 'success') return redirect_back()
def approve_comment(comment_id): comment = Comment.query.get_or_404(comment_id) with db.auto_commit(): comment.reviewed = True flash('评论审核成功', 'success') return redirect_back()
def delete_link(link_id): """删除链接视图""" link = Link.query.get_or_404(link_id) with db.auto_commit(): db.session.delete(link) return redirect_back()
def logout(): logout_user() flash('成功登出', 'info') return redirect_back()
def delete_comment(comment_id): comment = Comment.query.get_or_404(comment_id) with db.auto_commit(): db.session.delete(comment) flash('评论已删除', 'info') return redirect_back()
def delete_post(post_id): post = Post.query.get_or_404(post_id) with db.auto_commit(): db.session.delete(post) flash('文章已删除', 'info') return redirect_back()
def post(post_id): """ 文章详情视图,该视图处理发表评论功能 :param post_id: 文章 id """ post = Post.query.filter_by(id=post_id, trash=False, published=True).first_or_404() reply_id = request.args.get('reply_id') admin = Admin.query.first() per_page = admin.comment_per_page admin_email = admin.email # 该文章下不在回收站中、已审核且不是回复其它评论的评论 Pagination 对象 comment_pagination = Comment.query.with_parent(post).filter_by( trash=False, reviewed=True, replied_id=None).order_by( Comment.create_time.desc()).paginate(per_page=per_page) form = CommentForm(request.form) # 根据用户登录状态设置不同的字段数据 if current_user.is_authenticated: form.author.data = admin.nickname from_admin = True reviewed = True flash_message = '评论已发布。' else: from_admin = False reviewed = False flash_message = '您的评论会尽快被审核,感谢您的评论。' if form.validate_on_submit(): # 如果文章不允许评论,则直接返回 if not post.can_comment: flash('评论已关闭!', 'warning') return redirect_back() with db.auto_commit(): comment = Comment() comment.set_attr(form.data) comment.from_admin = from_admin comment.reviewed = reviewed comment.post = post if reply_id: replied_comment = Comment.query.get_or_404(reply_id) if replied_comment.trash or not replied_comment.reviewed or replied_comment.post.id != post.id: abort(404) comment.replied = replied_comment db.session.add(comment) flash(flash_message, 'primary') # 如果不是已登录用户,则发送邮件通知管理员审核 if not current_user.is_authenticated: send_mail([admin_email], '博客有新的评论需要审核', 'email/new_comment.html', post=post) return redirect( url_for('web.post', post_id=post.id, _anchor="commentResponse")) fields_name, fields_errors = get_form_error_items(form) # 如果是回复评论且表单验证失败,则跳转至专门显示表单错误的页面 if reply_id and form.errors: if request.referrer and is_safe_url(request.referrer): back_url = request.referrer else: back_url = url_for('web.post', post_id=post.id) return redirect( url_for('web.reply_error', fields_errors=','.join(fields_errors), back_url=back_url)) # 如果是主评论表单填写错误,flash 一条信息 if form.errors: flash('评论表单填写有误。', 'danger') return render_template('blog/post.html', post=post, comment_pagination=comment_pagination, form=form, fields_errors=fields_errors, fields_name=fields_name)
def delete_link(link_id): link = Link.query.get_or_404(link_id) with db.auto_commit(): db.session.delete(link) flash('链接删除成功', 'info') return redirect_back()