Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
def delete_category(category_id):
    """删除分类视图"""
    if category_id == 1:
        abort(404)

    category = Category.query.get_or_404(category_id)
    category.delete()
    return redirect_back()
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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()
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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()
Ejemplo n.º 9
0
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()
Ejemplo n.º 10
0
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)
Ejemplo n.º 11
0
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)
Ejemplo n.º 12
0
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()
Ejemplo n.º 13
0
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()
Ejemplo n.º 14
0
def delete_link(link_id):
    """删除链接视图"""
    link = Link.query.get_or_404(link_id)
    with db.auto_commit():
        db.session.delete(link)
    return redirect_back()
Ejemplo n.º 15
0
def logout():
    logout_user()
    flash('成功登出', 'info')
    return redirect_back()
Ejemplo n.º 16
0
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()
Ejemplo n.º 17
0
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()
Ejemplo n.º 18
0
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)
Ejemplo n.º 19
0
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()