from flask import request
import random
import re
from flask import current_app, jsonify
from flask import g
from flask import make_response
from flask import redirect
from flask import render_template
from flask import request
from flask import session
from flask import url_for
import time
from info import constants, db
from info import redis_store
from info.lib.yuntongxun.sms import CCP
from info.utils.captcha.captcha import captcha
from info.utils.image_storage import storage
from info.utils.response_code import RET
from info.modules.passport import passport_blu
from info.models import User, Category, News
from info.modules.profile import profile_blu
from info.utils.common import user_login_data
from datetime import datetime, timedelta

from . import admin_blu


@admin_blu.route("/login", methods=["GET", "POST"])
def admin_login():
    if request.method == "GET":
        # 去session　中取到指定的值
        user_id = session.get("user_id", None)
        is_admin = session.get("is_admin", False)
        if user_id and is_admin:
            return redirect(url_for("admin_index"))
        return render_template("admin/login.html")

    # 取到登陆的参数
    username = request.form.get("username")
    password = request.form.get("password")
    if not all([username, password]):
        return render_template("admin/login.html", errmsg="参数错误")

    try:
        user = User.query.filter(User.mobile == username).first()
    except Exception as e:
        current_app.logger.error(e)
        return render_template("admin/login.html", errmsg="数据错误")

    if not user:
        return render_template("admin/login.html", errmsg="用户名错误")

    if not user.check_password(password):
        return render_template("admin/login.html", errmsg="密码错误")

    if not user.is_admin:
        return render_template("admin/login.html", errmsg="用户不是管理员")

    session["user_id"] = user.id
    session["nick_name"] = user.nick_name
    session["mobile"] = user.mobile
    session["is_admin"] = True

    #  跳转到后台管理主页，暂未实现
    return redirect(url_for("admin.admin_index"))


@admin_blu.route("/index")
@user_login_data
def admin_index():
    user = g.user
    return render_template("admin/index.html", user=user.to_dict())


@admin_blu.before_request
def before_request():
    # 判断如果不是登陆页面的请求
    if not request.url.endswith(url_for("admin.admin_login")):
        user_id = session.get("user_id")
        is_admin = session.get("is_admin", False)

        if not user_id or not is_admin:
            # 判断当前是否有用户登陆，或者是否是管理员，如果不是，直接重定向到项目首页
            return redirect("/")


@admin_blu.route("/user_count")
def user_count():
    # 查询总人数
    total_count = 0
    try:
        total_count = User.query.filter(User.is_admin == False).count()
    except Exception as e:
        current_app.logger.error(e)

    # 查询月新增数
    mon_count = 0
    try:
        now = time.localtime()
        mon_begin = "%d-%02d-01" % (now.tm_year, now.tm_mon)
        mon_begin_date = datetime.strptime(mon_begin, "%Y-%m-%d")
        mon_count = User.query.filter(User.is_admin==False,
                                      User.create_time > mon_begin_date).count()
    except Exception as e:
        current_app.logger.error(e)

    day_count = 0
    try:
        day_begin = "%d-%02d-%02d" % (now.tm_year, now.tm_mon, now.tm_mday)
        day_begin_date = datetime.strptime(day_begin, "%Y-%m-%d")
        day_count = User.query.filter(User.is_admin==False,
                                      User.create_time >= day_begin_date).count()
    except Exception as e:
        current_app.logger.error(e)

    # 查询图表信息
    # 获取到当天00:00:00时间
    now_date = datetime.strptime(datetime.now().strftime("%Y-%m-%d"), "%Y-%m-%d")
    print(now_date)
    # 定义空数组，保存数据
    active_date = list()
    active_count = list()

    # 依次添加数据，再反转
    for i in range(0, 31):
        begin_date = now_date - timedelta(days=i)
        end_date = now_date - timedelta(days=(i - 1))
        active_date.append(begin_date.strftime("%Y-%m-%d"))
        count = 0
        try:
            count = User.query.filter(User.is_admin == False,
                                     User.last_login >= begin_date,
                                     User.last_login < end_date).count()
            print(count)
        except Exception as e:
            current_app.logger.error(e)
        active_count.append(count)

    active_date.reverse()
    active_count.reverse()

    data = {"total_count": total_count, "mon_count": mon_count, "day_count": day_count,
            "active_date": active_date, "active_count": active_count}

    return render_template("admin/user_count.html", data=data)


@admin_blu.route("/user_list")
def user_list():
    """获取用户列表"""
    # 获取参数
    page = request.args.get("p", 1)
    try:
        print(page)
        page = int(page)
    except Exception as e:
        current_app.logger.error(e)
        page = 1

    # 设置变量默认值
    users = []
    current_page = 1
    total_page = 1

    #查询数据
    try:
        paginate = User.query.filter(User.is_admin == False)\
            .order_by(User.last_login.desc())\
            .paginate(page, constants.ADMIN_NEWS_PAGE_MAX_COUNT, False)
        users = paginate.items
        current_page = paginate.page
        total_page = paginate.pages
    except Exception as e:
        current_app.logger.error(e)

    # 将模型列表转换成字典列表
    users_list = []
    for user in users:
        users_list.append(user.to_admin_dict())

    context = {
        "total_page": total_page,
        "current_page": current_page,
        "users": users_list
    }
    return render_template("admin/user_list.html", data=context)


@admin_blu.route("/news_review")
def news_review():
    """返回待审核新闻列表"""
    page = request.args.get("p", 1)
    keywords = request.args.get("keywords", "")
    try:
        page = int(page)
    except Exception as e:
        current_app.logger.error(e)
        page = 1

    news_list = list()
    current_page = 1
    total_page = 1

    try:
        filters = [News.status != 0]
        # 如果有关键词
        if keywords:
            # 添加关键字检索选项
            filters.append(News.title.contains(keywords))
        paginate = News.query.filter(*filters)\
            .order_by(News.create_time.desc())\
            .paginate(page, constants.ADMIN_NEWS_PAGE_MAX_COUNT, False)
        news_list = paginate.items
        current_page = paginate.page
        total_page = paginate.pages
    except Exception as e:
        current_app.error(e)

    news_dict_list = list()
    for news in news_list:
        news_dict_list.append(news.to_review_dict())

    data = {
        "total_page": total_page,
        "current_page": current_page,
        "news_list": news_dict_list
    }
    return render_template("admin/news_review.html", data=data)


@admin_blu.route("/news_review_detail", methods=["GET", "POST"])
def news_review_detail():
    """新闻审核"""
    # 获取新闻id
    if request.method == "GET":
        news_id = request.args.get("news_id")
        if not news_id:
            data = {
                "errmsg": "未查询到数据"
            }
            return render_template("admin/news_review_detail.html", data=data)
        # 通过id查询新闻
        news = None
        try:
            news = News.query.get(news_id)
        except Exception as e:
            current_app.logger.error(e)

        if not news:
            data = {
                "errmsg": "未查询到数据"
            }
            return render_template("admin/news_review_detail.html", data=data)

        # 返回数据
        data = {
            "news": news.to_dict()
        }
        return render_template("admin/news_review_detail.html", data=data)

    # 执行审核操作
    # 1. 获取参数
    news_id = request.json.get("news_id")
    action = request.json.get("action")

    #2. 判断参数
    if not all([news_id, action]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
    if action not in ("accept", "reject"):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")

    news = None
    try:
        #　3. 查询新闻
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)

    if not news:
        return jsonify(errno=RET.NODATA, errmsg="未查询到数据")

    if action == "accept":
        news.status = 0
    else:
        # 拒绝通过，需要获取原因
        reason = request.json.get("reason")
        if not reason:
            return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
        news.reason = reason
        news.status = -1
    # 保存数据库
    try:
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="保存数据失败")
    return jsonify(errno=RET.OK, errmsg="操作成功")


@admin_blu.route("/news_edit", methods=["GET", "POST"])
def news_edit():
    """返回新闻列表"""

    page = request.args.get("p", "1")
    print(page)
    a = re.match(r"^\d*", page)
    b = re.findall(r"""keywords=(\w*)""", page)
    print(b)
    page = a.group()
    if b != []:
        b = b[0]
        keywords = b
    else:
        keywords = None
        b = ""
    try:
        page = int(page)
    except Exception as e:
        current_app.logger.error(e)
        page = 1

    news_list = list()
    current_page = 1
    total_page = 1
    try:
        filters = list()
        # 如果有关键词
        if keywords:
            # 添加关键词的检索选项
            filters.append(News.title.contains(keywords))
        # 查询
        paginate = News.query.filter(*filters)\
            .order_by(News.create_time.desc())\
            .paginate(page, constants.ADMIN_NEWS_PAGE_MAX_COUNT, False)
        news_list = paginate.items
        current_page = paginate.page
        total_page = paginate.pages
    except Exception as e:
        current_app.logger.error(e)

    news_dict_list = list()
    for news in news_list:
        news_dict_list.append(news.to_basic_dict())

    data = {
        "total_page": total_page,
        "current_page": current_page,
        "new_list": news_dict_list,
        "last_input": b
    }
    if request.method == "GET":
        return render_template("admin/news_edit.html", data=data)
    # return jsonify(errno=RET.OK, errmsg="OK")
    return render_template("admin/news_edit.html", data=data)


@admin_blu.route("/news_edit_detail", methods=["GET", "POST"])
def news_edit_detail():
    """新闻编辑详情"""
    if request.method == "GET":
        # 获取参数
        news_id = request.args.get("news_id")
        if not news_id:
            data = {
                "errmsg": "没有找到新闻"
            }
            return render_template("admin/news_edit_detail.html", data=data)
        # 查询新闻
        news = None
        try:
            news = News.query.get(news_id)
        except Exception as e:
            current_app.logger.error(e)

        if not news:
            data = {
                "errmsg": "没有找到新闻"
            }
            return render_template("admin/news_edit_detail.html", data=data)

        categories = Category.query.all()
        categories_li = []
        for category in categories:
            c_dict = category.to_dict()
            c_dict["is_selected"] = False
            if category.id == News.category_id:
                c_dict["is_selected"] = True
            categories_li.append(c_dict)

        # 移除最新分类
        categories_li.pop(0)
        data = {
            "news": news.to_dict(),
            "categories": categories_li
        }
        return render_template("admin/news_edit_detail.html", data=data)

    news_id = request.form.get("news_id")
    title = request.form.get("title")
    digest= request.form.get("digest")
    content = request.form.get("content")
    index_image = request.form.get("index-image")
    categery_id = request.form.get("category_id")
    # 1.1　判断数据是否有值：
    if not all([title, digest, content, categery_id]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数有误")
    print(title, digest, content, categery_id)
    news = None
    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
    if not news:
        return jsonify(errno=RET.NODATA, errmsg="未找到新闻数据")

    # 1.2 尝试读取图片
    if index_image:
        try:
            index_image = index_image.read()
        except Exception as e:
            return jsonify(errno=RET.PARAMERR, errmsg="参数有误")

        # 2. 将标题图片上传到七牛
        try:
            key = storage(index_image)
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.THIRDERR, errmsg="上传图片错误")
        news.index_image_url = constants.QINIU_DOMIN_PREFIX + key

    # 3. 设置相关数据
    news.title = title
    news.digest = digest
    news.content = content
    news.category_id = categery_id

    # 4. 保存到数据库
    try:
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="保存数据失败")
    # 5. 返回结果

    return jsonify(errno=RET.OK, errmsg="编辑成功")


@admin_blu.route("/news_category")
def get_news_category():
    # 获取所有的分类数据
    categories = Category.query.all()
    # 定义列表保存分类数据
    categories_dicts = []

    for category in categories:
        # 获取字典
        cate_dict = category.to_dict()
        # 拼接内容
        categories_dicts.append(cate_dict)

    categories_dicts.pop(0)
    # 返回内容
    data = {
        "categories": categories_dicts
    }
    return render_template("admin/news_type.html", data=data)


@admin_blu.route("/add_category", methods=["POST"])
def add_category():
    """修改或者添加分类"""
    category_id = request.json.get("id")
    category_name = request.json.get("name")
    print(category_name)
    if not category_name:
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
    # 判断是否有分类id
    if category_id:
        try:
            category = Category.query.get(category_id)
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR, errmsg="查询数据失败")

        if not category:
            return jsonify(errno=RET.NODATA, errmsg="未查询到分类信息")

        category.name = category_name
        return jsonify(errno=RET.OK, errmsg="保存数据成功")

    else:
        # 如果没有分类id, 添加分类
        try:
            new_category = Category()
            new_category.id = category_id
            new_category.name = category_name
            db.session.add(new_category)
            db.session.commit()
        except Exception as e:
            current_app.logger.error(e)
            db.session.rollback()
            return jsonify(errno=RET.DBERR, errmsg="保存数据失败")
        return jsonify(errno=RET.OK, errmsg="保存数据成功")


[(39, 'flask.request.form.get', 'request.form.get', (['"""username"""'], {}), False, 'from flask import request\n'), (40, 'flask.request.form.get', 'request.form.get', (['"""password"""'], {}), False, 'from flask import request\n'), (145, 'flask.render_template', 'render_template', (['"""admin/user_count.html"""'], {'data': 'data'}), False, 'from flask import render_template\n'), (152, 'flask.request.args.get', 'request.args.get', (['"""p"""', '(1)'], {}), False, 'from flask import request\n'), (186, 'flask.render_template', 'render_template', (['"""admin/user_list.html"""'], {'data': 'context'}), False, 'from flask import render_template\n'), (192, 'flask.request.args.get', 'request.args.get', (['"""p"""', '(1)'], {}), False, 'from flask import request\n'), (193, 'flask.request.args.get', 'request.args.get', (['"""keywords"""', '""""""'], {}), False, 'from flask import request\n'), (228, 'flask.render_template', 'render_template', (['"""admin/news_review.html"""'], {'data': 'data'}), False, 'from flask import render_template\n'), (263, 'flask.request.json.get', 'request.json.get', (['"""news_id"""'], {}), False, 'from flask import request\n'), (264, 'flask.request.json.get', 'request.json.get', (['"""action"""'], {}), False, 'from flask import request\n'), (298, 'flask.jsonify', 'jsonify', ([], {'errno': 'RET.OK', 'errmsg': '"""操作成功"""'}), False, 'from flask import current_app, jsonify\n'), (305, 'flask.request.args.get', 'request.args.get', (['"""p"""', '"""1"""'], {}), False, 'from flask import request\n'), (307, 're.match', 're.match', (['"""^\\\\d*"""', 'page'], {}), False, 'import re\n'), (308, 're.findall', 're.findall', (['"""keywords=(\\\\w*)"""', 'page'], {}), False, 'import re\n'), (355, 'flask.render_template', 'render_template', (['"""admin/news_edit.html"""'], {'data': 'data'}), False, 'from flask import render_template\n'), (399, 'flask.request.form.get', 'request.form.get', (['"""news_id"""'], {}), False, 'from flask import request\n'), (400, 'flask.request.form.get', 'request.form.get', (['"""title"""'], {}), False, 'from flask import request\n'), (401, 'flask.request.form.get', 'request.form.get', (['"""digest"""'], {}), False, 'from flask import request\n'), (402, 'flask.request.form.get', 'request.form.get', (['"""content"""'], {}), False, 'from flask import request\n'), (403, 'flask.request.form.get', 'request.form.get', (['"""index-image"""'], {}), False, 'from flask import request\n'), (404, 'flask.request.form.get', 'request.form.get', (['"""category_id"""'], {}), False, 'from flask import request\n'), (447, 'flask.jsonify', 'jsonify', ([], {'errno': 'RET.OK', 'errmsg': '"""编辑成功"""'}), False, 'from flask import current_app, jsonify\n'), (453, 'info.models.Category.query.all', 'Category.query.all', ([], {}), False, 'from info.models import User, Category, News\n'), (468, 'flask.render_template', 'render_template', (['"""admin/news_type.html"""'], {'data': 'data'}), False, 'from flask import render_template\n'), (474, 'flask.request.json.get', 'request.json.get', (['"""id"""'], {}), False, 'from flask import request\n'), (475, 'flask.request.json.get', 'request.json.get', (['"""name"""'], {}), False, 'from flask import request\n'), (32, 'flask.session.get', 'session.get', (['"""user_id"""', 'None'], {}), False, 'from flask import session\n'), (33, 'flask.session.get', 'session.get', (['"""is_admin"""', '(False)'], {}), False, 'from flask import session\n'), (36, 'flask.render_template', 'render_template', (['"""admin/login.html"""'], {}), False, 'from flask import render_template\n'), (42, 'flask.render_template', 'render_template', (['"""admin/login.html"""'], {'errmsg': '"""参数错误"""'}), False, 'from flask import render_template\n'), (51, 'flask.render_template', 'render_template', (['"""admin/login.html"""'], {'errmsg': '"""用户名错误"""'}), False, 'from flask import render_template\n'), (54, 'flask.render_template', 'render_template', (['"""admin/login.html"""'], {'errmsg': '"""密码错误"""'}), False, 'from flask import render_template\n'), (57, 'flask.render_template', 'render_template', (['"""admin/login.html"""'], {'errmsg': '"""用户不是管理员"""'}), False, 'from flask import render_template\n'), (65, 'flask.url_for', 'url_for', (['"""admin.admin_index"""'], {}), False, 'from flask import url_for\n'), (79, 'flask.session.get', 'session.get', (['"""user_id"""'], {}), False, 'from flask import session\n'), (80, 'flask.session.get', 'session.get', (['"""is_admin"""', '(False)'], {}), False, 'from flask import session\n'), (99, 'time.localtime', 'time.localtime', ([], {}), False, 'import time\n'), (101, 'datetime.datetime.strptime', 'datetime.strptime', (['mon_begin', '"""%Y-%m-%d"""'], {}), False, 'from datetime import datetime, timedelta\n'), (110, 'datetime.datetime.strptime', 'datetime.strptime', (['day_begin', '"""%Y-%m-%d"""'], {}), False, 'from datetime import datetime, timedelta\n'), (236, 'flask.request.args.get', 'request.args.get', (['"""news_id"""'], {}), False, 'from flask import request\n'), (259, 'flask.render_template', 'render_template', (['"""admin/news_review_detail.html"""'], {'data': 'data'}), False, 'from flask import render_template\n'), (268, 'flask.jsonify', 'jsonify', ([], {'errno': 'RET.PARAMERR', 'errmsg': '"""参数错误"""'}), False, 'from flask import current_app, jsonify\n'), (270, 'flask.jsonify', 'jsonify', ([], {'errno': 'RET.PARAMERR', 'errmsg': '"""参数错误"""'}), False, 'from flask import current_app, jsonify\n'), (275, 'info.models.News.query.get', 'News.query.get', (['news_id'], {}), False, 'from info.models import User, Category, News\n'), (280, 'flask.jsonify', 'jsonify', ([], {'errno': 'RET.NODATA', 'errmsg': '"""未查询到数据"""'}), False, 'from flask import current_app, jsonify\n'), (286, 'flask.request.json.get', 'request.json.get', (['"""reason"""'], {}), False, 'from flask import request\n'), (293, 'info.db.session.commit', 'db.session.commit', ([], {}), False, 'from info import constants, db\n'), (353, 'flask.render_template', 'render_template', (['"""admin/news_edit.html"""'], {'data': 'data'}), False, 'from flask import render_template\n'), (363, 'flask.request.args.get', 'request.args.get', (['"""news_id"""'], {}), False, 'from flask import request\n'), (382, 'info.models.Category.query.all', 'Category.query.all', ([], {}), False, 'from info.models import User, Category, News\n'), (397, 'flask.render_template', 'render_template', (['"""admin/news_edit_detail.html"""'], {'data': 'data'}), False, 'from flask import render_template\n'), (407, 'flask.jsonify', 'jsonify', ([], {'errno': 'RET.PARAMERR', 'errmsg': '"""参数有误"""'}), False, 'from flask import current_app, jsonify\n'), (411, 'info.models.News.query.get', 'News.query.get', (['news_id'], {}), False, 'from info.models import User, Category, News\n'), (415, 'flask.jsonify', 'jsonify', ([], {'errno': 'RET.NODATA', 'errmsg': '"""未找到新闻数据"""'}), False, 'from flask import current_app, jsonify\n'), (440, 'info.db.session.commit', 'db.session.commit', ([], {}), False, 'from info import constants, db\n'), (478, 'flask.jsonify', 'jsonify', ([], {'errno': 'RET.PARAMERR', 'errmsg': '"""参数错误"""'}), False, 'from flask import current_app, jsonify\n'), (491, 'flask.jsonify', 'jsonify', ([], {'errno': 'RET.OK', 'errmsg': '"""保存数据成功"""'}), False, 'from flask import current_app, jsonify\n'), (505, 'flask.jsonify', 'jsonify', ([], {'errno': 'RET.OK', 'errmsg': '"""保存数据成功"""'}), False, 'from flask import current_app, jsonify\n'), (47, 'flask.current_app.logger.error', 'current_app.logger.error', (['e'], {}), False, 'from flask import current_app, jsonify\n'), (48, 'flask.render_template', 'render_template', (['"""admin/login.html"""'], {'errmsg': '"""数据错误"""'}), False, 'from flask import render_template\n'), (78, 'flask.url_for', 'url_for', (['"""admin.admin_login"""'], {}), False, 'from flask import url_for\n'), (84, 'flask.redirect', 'redirect', (['"""/"""'], {}), False, 'from flask import redirect\n'), (94, 'flask.current_app.logger.error', 'current_app.logger.error', (['e'], {}), False, 'from flask import current_app, jsonify\n'), (105, 'flask.current_app.logger.error', 'current_app.logger.error', (['e'], {}), False, 'from flask import current_app, jsonify\n'), (114, 'flask.current_app.logger.error', 'current_app.logger.error', (['e'], {}), False, 'from flask import current_app, jsonify\n'), (126, 'datetime.timedelta', 'timedelta', ([], {'days': 'i'}), False, 'from datetime import datetime, timedelta\n'), (127, 'datetime.timedelta', 'timedelta', ([], {'days': '(i - 1)'}), False, 'from datetime import datetime, timedelta\n'), (157, 'flask.current_app.logger.error', 'current_app.logger.error', (['e'], {}), False, 'from flask import current_app, jsonify\n'), (174, 'flask.current_app.logger.error', 'current_app.logger.error', (['e'], {}), False, 'from flask import current_app, jsonify\n'), (197, 'flask.current_app.logger.error', 'current_app.logger.error', (['e'], {}), False, 'from flask import current_app, jsonify\n'), (217, 'flask.current_app.error', 'current_app.error', (['e'], {}), False, 'from flask import current_app, jsonify\n'), (241, 'flask.render_template', 'render_template', (['"""admin/news_review_detail.html"""'], {'data': 'data'}), False, 'from flask import render_template\n'), (245, 'info.models.News.query.get', 'News.query.get', (['news_id'], {}), False, 'from info.models import User, Category, News\n'), (253, 'flask.render_template', 'render_template', (['"""admin/news_review_detail.html"""'], {'data': 'data'}), False, 'from flask import render_template\n'), (277, 'flask.current_app.logger.error', 'current_app.logger.error', (['e'], {}), False, 'from flask import current_app, jsonify\n'), (288, 'flask.jsonify', 'jsonify', ([], {'errno': 'RET.PARAMERR', 'errmsg': '"""参数错误"""'}), False, 'from flask import current_app, jsonify\n'), (295, 'flask.current_app.logger.error', 'current_app.logger.error', (['e'], {}), False, 'from flask import current_app, jsonify\n'), (296, 'info.db.session.rollback', 'db.session.rollback', ([], {}), False, 'from info import constants, db\n'), (297, 'flask.jsonify', 'jsonify', ([], {'errno': 'RET.DBERR', 'errmsg': '"""保存数据失败"""'}), False, 'from flask import current_app, jsonify\n'), (320, 'flask.current_app.logger.error', 'current_app.logger.error', (['e'], {}), False, 'from flask import current_app, jsonify\n'), (340, 'flask.current_app.logger.error', 'current_app.logger.error', (['e'], {}), False, 'from flask import current_app, jsonify\n'), (368, 'flask.render_template', 'render_template', (['"""admin/news_edit_detail.html"""'], {'data': 'data'}), False, 'from flask import render_template\n'), (372, 'info.models.News.query.get', 'News.query.get', (['news_id'], {}), False, 'from info.models import User, Category, News\n'), (380, 'flask.render_template', 'render_template', (['"""admin/news_edit_detail.html"""'], {'data': 'data'}), False, 'from flask import render_template\n'), (413, 'flask.current_app.logger.error', 'current_app.logger.error', (['e'], {}), False, 'from flask import current_app, jsonify\n'), (426, 'info.utils.image_storage.storage', 'storage', (['index_image'], {}), False, 'from info.utils.image_storage import storage\n'), (442, 'flask.current_app.logger.error', 'current_app.logger.error', (['e'], {}), False, 'from flask import current_app, jsonify\n'), (443, 'info.db.session.rollback', 'db.session.rollback', ([], {}), False, 'from info import constants, db\n'), (444, 'flask.jsonify', 'jsonify', ([], {'errno': 'RET.DBERR', 'errmsg': '"""保存数据失败"""'}), False, 'from flask import current_app, jsonify\n'), (482, 'info.models.Category.query.get', 'Category.query.get', (['category_id'], {}), False, 'from info.models import User, Category, News\n'), (488, 'flask.jsonify', 'jsonify', ([], {'errno': 'RET.NODATA', 'errmsg': '"""未查询到分类信息"""'}), False, 'from flask import current_app, jsonify\n'), (496, 'info.models.Category', 'Category', ([], {}), False, 'from info.models import User, Category, News\n'), (499, 'info.db.session.add', 'db.session.add', (['new_category'], {}), False, 'from info import constants, db\n'), (500, 'info.db.session.commit', 'db.session.commit', ([], {}), False, 'from info import constants, db\n'), (35, 'flask.url_for', 'url_for', (['"""admin_index"""'], {}), False, 'from flask import url_for\n'), (45, 'info.models.User.query.filter', 'User.query.filter', (['(User.mobile == username)'], {}), False, 'from info.models import User, Category, News\n'), (92, 'info.models.User.query.filter', 'User.query.filter', (['(User.is_admin == False)'], {}), False, 'from info.models import User, Category, News\n'), (102, 'info.models.User.query.filter', 'User.query.filter', (['(User.is_admin == False)', '(User.create_time > mon_begin_date)'], {}), False, 'from info.models import User, Category, News\n'), (111, 'info.models.User.query.filter', 'User.query.filter', (['(User.is_admin == False)', '(User.create_time >= day_begin_date)'], {}), False, 'from info.models import User, Category, News\n'), (118, 'datetime.datetime.now', 'datetime.now', ([], {}), False, 'from datetime import datetime, timedelta\n'), (136, 'flask.current_app.logger.error', 'current_app.logger.error', (['e'], {}), False, 'from flask import current_app, jsonify\n'), (209, 'info.models.News.title.contains', 'News.title.contains', (['keywords'], {}), False, 'from info.models import User, Category, News\n'), (247, 'flask.current_app.logger.error', 'current_app.logger.error', (['e'], {}), False, 'from flask import current_app, jsonify\n'), (331, 'info.models.News.title.contains', 'News.title.contains', (['keywords'], {}), False, 'from info.models import User, Category, News\n'), (374, 'flask.current_app.logger.error', 'current_app.logger.error', (['e'], {}), False, 'from flask import current_app, jsonify\n'), (422, 'flask.jsonify', 'jsonify', ([], {'errno': 'RET.PARAMERR', 'errmsg': '"""参数有误"""'}), False, 'from flask import current_app, jsonify\n'), (428, 'flask.current_app.logger.error', 'current_app.logger.error', (['e'], {}), False, 'from flask import current_app, jsonify\n'), (429, 'flask.jsonify', 'jsonify', ([], {'errno': 'RET.THIRDERR', 'errmsg': '"""上传图片错误"""'}), False, 'from flask import current_app, jsonify\n'), (484, 'flask.current_app.logger.error', 'current_app.logger.error', (['e'], {}), False, 'from flask import current_app, jsonify\n'), (485, 'flask.jsonify', 'jsonify', ([], {'errno': 'RET.DBERR', 'errmsg': '"""查询数据失败"""'}), False, 'from flask import current_app, jsonify\n'), (502, 'flask.current_app.logger.error', 'current_app.logger.error', (['e'], {}), False, 'from flask import current_app, jsonify\n'), (503, 'info.db.session.rollback', 'db.session.rollback', ([], {}), False, 'from info import constants, db\n'), (504, 'flask.jsonify', 'jsonify', ([], {'errno': 'RET.DBERR', 'errmsg': '"""保存数据失败"""'}), False, 'from flask import current_app, jsonify\n'), (131, 'info.models.User.query.filter', 'User.query.filter', (['(User.is_admin == False)', '(User.last_login >= begin_date)', '(User.last_login < end_date)'], {}), False, 'from info.models import User, Category, News\n'), (168, 'info.models.User.last_login.desc', 'User.last_login.desc', ([], {}), False, 'from info.models import User, Category, News\n'), (211, 'info.models.News.create_time.desc', 'News.create_time.desc', ([], {}), False, 'from info.models import User, Category, News\n'), (334, 'info.models.News.create_time.desc', 'News.create_time.desc', ([], {}), False, 'from info.models import User, Category, News\n'), (167, 'info.models.User.query.filter', 'User.query.filter', (['(User.is_admin == False)'], {}), False, 'from info.models import User, Category, News\n'), (210, 'info.models.News.query.filter', 'News.query.filter', (['*filters'], {}), False, 'from info.models import User, Category, News\n'), (333, 'info.models.News.query.filter', 'News.query.filter', (['*filters'], {}), False, 'from info.models import User, Category, News\n')]