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, 15, 39, 43), 'flask.request.form.get', 'request.form.get', ({(39, 32, 39, 42): '"""username"""'}, {}), "('username')", False, 'from flask import request\n'), ((40, 15, 40, 43), 'flask.request.form.get', 'request.form.get', ({(40, 32, 40, 42): '"""password"""'}, {}), "('password')", False, 'from flask import request\n'), ((145, 11, 145, 62), 'flask.render_template', 'render_template', (), '', False, 'from flask import render_template\n'), ((152, 11, 152, 35), 'flask.request.args.get', 'request.args.get', ({(152, 28, 152, 31): '"""p"""', (152, 33, 152, 34): '1'}, {}), "('p', 1)", False, 'from flask import request\n'), ((186, 11, 186, 64), 'flask.render_template', 'render_template', (), '', False, 'from flask import render_template\n'), ((192, 11, 192, 35), 'flask.request.args.get', 'request.args.get', ({(192, 28, 192, 31): '"""p"""', (192, 33, 192, 34): '1'}, {}), "('p', 1)", False, 'from flask import request\n'), ((193, 15, 193, 47), 'flask.request.args.get', 'request.args.get', ({(193, 32, 193, 42): '"""keywords"""', (193, 44, 193, 46): '""""""'}, {}), "('keywords', '')", False, 'from flask import request\n'), ((228, 11, 228, 63), 'flask.render_template', 'render_template', (), '', False, 'from flask import render_template\n'), ((263, 14, 263, 41), 'flask.request.json.get', 'request.json.get', ({(263, 31, 263, 40): '"""news_id"""'}, {}), "('news_id')", False, 'from flask import request\n'), ((264, 13, 264, 39), 'flask.request.json.get', 'request.json.get', ({(264, 30, 264, 38): '"""action"""'}, {}), "('action')", False, 'from flask import request\n'), ((298, 11, 298, 55), 'flask.jsonify', 'jsonify', (), '', False, 'from flask import current_app, jsonify\n'), ((305, 11, 305, 37), 'flask.request.args.get', 'request.args.get', ({(305, 28, 305, 31): '"""p"""', (305, 33, 305, 36): '"""1"""'}, {}), "('p', '1')", False, 'from flask import request\n'), ((307, 8, 307, 31), 're.match', 're.match', ({(307, 17, 307, 24): '"""^\\\\d*"""', (307, 26, 307, 30): 'page'}, {}), "('^\\\\d*', page)", False, 'import re\n'), ((308, 8, 308, 47), 're.findall', 're.findall', ({(308, 19, 308, 40): '"""keywords=(\\\\w*)"""', (308, 42, 308, 46): 'page'}, {}), "('keywords=(\\\\w*)', page)", False, 'import re\n'), ((355, 11, 355, 61), 'flask.render_template', 'render_template', (), '', False, 'from flask import render_template\n'), ((399, 14, 399, 41), 'flask.request.form.get', 'request.form.get', ({(399, 31, 399, 40): '"""news_id"""'}, {}), "('news_id')", False, 'from flask import request\n'), ((400, 12, 400, 37), 'flask.request.form.get', 'request.form.get', ({(400, 29, 400, 36): '"""title"""'}, {}), "('title')", False, 'from flask import request\n'), ((401, 12, 401, 38), 'flask.request.form.get', 'request.form.get', ({(401, 29, 401, 37): '"""digest"""'}, {}), "('digest')", False, 'from flask import request\n'), ((402, 14, 402, 41), 'flask.request.form.get', 'request.form.get', ({(402, 31, 402, 40): '"""content"""'}, {}), "('content')", False, 'from flask import request\n'), ((403, 18, 403, 49), 'flask.request.form.get', 'request.form.get', ({(403, 35, 403, 48): '"""index-image"""'}, {}), "('index-image')", False, 'from flask import request\n'), ((404, 18, 404, 49), 'flask.request.form.get', 'request.form.get', ({(404, 35, 404, 48): '"""category_id"""'}, {}), "('category_id')", False, 'from flask import request\n'), ((447, 11, 447, 55), 'flask.jsonify', 'jsonify', (), '', False, 'from flask import current_app, jsonify\n'), ((453, 17, 453, 37), 'info.models.Category.query.all', 'Category.query.all', ({}, {}), '()', False, 'from info.models import User, Category, News\n'), ((468, 11, 468, 61), 'flask.render_template', 'render_template', (), '', False, 'from flask import render_template\n'), ((474, 18, 474, 40), 'flask.request.json.get', 'request.json.get', ({(474, 35, 474, 39): '"""id"""'}, {}), "('id')", False, 'from flask import request\n'), ((475, 20, 475, 44), 'flask.request.json.get', 'request.json.get', ({(475, 37, 475, 43): '"""name"""'}, {}), "('name')", False, 'from flask import request\n'), ((32, 18, 32, 46), 'flask.session.get', 'session.get', ({(32, 30, 32, 39): '"""user_id"""', (32, 41, 32, 45): 'None'}, {}), "('user_id', None)", False, 'from flask import session\n'), ((33, 19, 33, 49), 'flask.session.get', 'session.get', ({(33, 31, 33, 41): '"""is_admin"""', (33, 43, 33, 48): 'False'}, {}), "('is_admin', False)", False, 'from flask import session\n'), ((36, 15, 36, 50), 'flask.render_template', 'render_template', ({(36, 31, 36, 49): '"""admin/login.html"""'}, {}), "('admin/login.html')", False, 'from flask import render_template\n'), ((42, 15, 42, 73), 'flask.render_template', 'render_template', (), '', False, 'from flask import render_template\n'), ((51, 15, 51, 76), 'flask.render_template', 'render_template', (), '', False, 'from flask import render_template\n'), ((54, 15, 54, 73), 'flask.render_template', 'render_template', (), '', False, 'from flask import render_template\n'), ((57, 15, 57, 82), 'flask.render_template', 'render_template', (), '', False, 'from flask import render_template\n'), ((65, 20, 65, 48), 'flask.url_for', 'url_for', ({(65, 28, 65, 47): '"""admin.admin_index"""'}, {}), "('admin.admin_index')", False, 'from flask import url_for\n'), ((79, 18, 79, 40), 'flask.session.get', 'session.get', ({(79, 30, 79, 39): '"""user_id"""'}, {}), "('user_id')", False, 'from flask import session\n'), ((80, 19, 80, 49), 'flask.session.get', 'session.get', ({(80, 31, 80, 41): '"""is_admin"""', (80, 43, 80, 48): 'False'}, {}), "('is_admin', False)", False, 'from flask import session\n'), ((99, 14, 99, 30), 'time.localtime', 'time.localtime', ({}, {}), '()', False, 'import time\n'), ((101, 25, 101, 65), 'datetime.datetime.strptime', 'datetime.strptime', ({(101, 43, 101, 52): 'mon_begin', (101, 54, 101, 64): '"""%Y-%m-%d"""'}, {}), "(mon_begin, '%Y-%m-%d')", False, 'from datetime import datetime, timedelta\n'), ((110, 25, 110, 65), 'datetime.datetime.strptime', 'datetime.strptime', ({(110, 43, 110, 52): 'day_begin', (110, 54, 110, 64): '"""%Y-%m-%d"""'}, {}), "(day_begin, '%Y-%m-%d')", False, 'from datetime import datetime, timedelta\n'), ((236, 18, 236, 45), 'flask.request.args.get', 'request.args.get', ({(236, 35, 236, 44): '"""news_id"""'}, {}), "('news_id')", False, 'from flask import request\n'), ((259, 15, 259, 74), 'flask.render_template', 'render_template', (), '', False, 'from flask import render_template\n'), ((268, 15, 268, 65), 'flask.jsonify', 'jsonify', (), '', False, 'from flask import current_app, jsonify\n'), ((270, 15, 270, 65), 'flask.jsonify', 'jsonify', (), '', False, 'from flask import current_app, jsonify\n'), ((275, 15, 275, 38), 'info.models.News.query.get', 'News.query.get', ({(275, 30, 275, 37): 'news_id'}, {}), '(news_id)', False, 'from info.models import User, Category, News\n'), ((280, 15, 280, 69), 'flask.jsonify', 'jsonify', (), '', False, 'from flask import current_app, jsonify\n'), ((286, 17, 286, 43), 'flask.request.json.get', 'request.json.get', ({(286, 34, 286, 42): '"""reason"""'}, {}), "('reason')", False, 'from flask import request\n'), ((293, 8, 293, 27), 'info.db.session.commit', 'db.session.commit', ({}, {}), '()', False, 'from info import constants, db\n'), ((353, 15, 353, 65), 'flask.render_template', 'render_template', (), '', False, 'from flask import render_template\n'), ((363, 18, 363, 45), 'flask.request.args.get', 'request.args.get', ({(363, 35, 363, 44): '"""news_id"""'}, {}), "('news_id')", False, 'from flask import request\n'), ((382, 21, 382, 41), 'info.models.Category.query.all', 'Category.query.all', ({}, {}), '()', False, 'from info.models import User, Category, News\n'), ((397, 15, 397, 72), 'flask.render_template', 'render_template', (), '', False, 'from flask import render_template\n'), ((407, 15, 407, 65), 'flask.jsonify', 'jsonify', (), '', False, 'from flask import current_app, jsonify\n'), ((411, 15, 411, 38), 'info.models.News.query.get', 'News.query.get', ({(411, 30, 411, 37): 'news_id'}, {}), '(news_id)', False, 'from info.models import User, Category, News\n'), ((415, 15, 415, 72), 'flask.jsonify', 'jsonify', (), '', False, 'from flask import current_app, jsonify\n'), ((440, 8, 440, 27), 'info.db.session.commit', 'db.session.commit', ({}, {}), '()', False, 'from info import constants, db\n'), ((478, 15, 478, 65), 'flask.jsonify', 'jsonify', (), '', False, 'from flask import current_app, jsonify\n'), ((491, 15, 491, 65), 'flask.jsonify', 'jsonify', (), '', False, 'from flask import current_app, jsonify\n'), ((505, 15, 505, 65), 'flask.jsonify', 'jsonify', (), '', False, 'from flask import current_app, jsonify\n'), ((47, 8, 47, 35), 'flask.current_app.logger.error', 'current_app.logger.error', ({(47, 33, 47, 34): 'e'}, {}), '(e)', False, 'from flask import current_app, jsonify\n'), ((48, 15, 48, 73), 'flask.render_template', 'render_template', (), '', False, 'from flask import render_template\n'), ((78, 32, 78, 60), 'flask.url_for', 'url_for', ({(78, 40, 78, 59): '"""admin.admin_login"""'}, {}), "('admin.admin_login')", False, 'from flask import url_for\n'), ((84, 19, 84, 32), 'flask.redirect', 'redirect', ({(84, 28, 84, 31): '"""/"""'}, {}), "('/')", False, 'from flask import redirect\n'), ((94, 8, 94, 35), 'flask.current_app.logger.error', 'current_app.logger.error', ({(94, 33, 94, 34): 'e'}, {}), '(e)', False, 'from flask import current_app, jsonify\n'), ((105, 8, 105, 35), 'flask.current_app.logger.error', 'current_app.logger.error', ({(105, 33, 105, 34): 'e'}, {}), '(e)', False, 'from flask import current_app, jsonify\n'), ((114, 8, 114, 35), 'flask.current_app.logger.error', 'current_app.logger.error', ({(114, 33, 114, 34): 'e'}, {}), '(e)', False, 'from flask import current_app, jsonify\n'), ((126, 32, 126, 49), 'datetime.timedelta', 'timedelta', (), '', False, 'from datetime import datetime, timedelta\n'), ((127, 30, 127, 53), 'datetime.timedelta', 'timedelta', (), '', False, 'from datetime import datetime, timedelta\n'), ((157, 8, 157, 35), 'flask.current_app.logger.error', 'current_app.logger.error', ({(157, 33, 157, 34): 'e'}, {}), '(e)', False, 'from flask import current_app, jsonify\n'), ((174, 8, 174, 35), 'flask.current_app.logger.error', 'current_app.logger.error', ({(174, 33, 174, 34): 'e'}, {}), '(e)', False, 'from flask import current_app, jsonify\n'), ((197, 8, 197, 35), 'flask.current_app.logger.error', 'current_app.logger.error', ({(197, 33, 197, 34): 'e'}, {}), '(e)', False, 'from flask import current_app, jsonify\n'), ((217, 8, 217, 28), 'flask.current_app.error', 'current_app.error', ({(217, 26, 217, 27): 'e'}, {}), '(e)', False, 'from flask import current_app, jsonify\n'), ((241, 19, 241, 78), 'flask.render_template', 'render_template', (), '', False, 'from flask import render_template\n'), ((245, 19, 245, 42), 'info.models.News.query.get', 'News.query.get', ({(245, 34, 245, 41): 'news_id'}, {}), '(news_id)', False, 'from info.models import User, Category, News\n'), ((253, 19, 253, 78), 'flask.render_template', 'render_template', (), '', False, 'from flask import render_template\n'), ((277, 8, 277, 35), 'flask.current_app.logger.error', 'current_app.logger.error', ({(277, 33, 277, 34): 'e'}, {}), '(e)', False, 'from flask import current_app, jsonify\n'), ((288, 19, 288, 69), 'flask.jsonify', 'jsonify', (), '', False, 'from flask import current_app, jsonify\n'), ((295, 8, 295, 35), 'flask.current_app.logger.error', 'current_app.logger.error', ({(295, 33, 295, 34): 'e'}, {}), '(e)', False, 'from flask import current_app, jsonify\n'), ((296, 8, 296, 29), 'info.db.session.rollback', 'db.session.rollback', ({}, {}), '()', False, 'from info import constants, db\n'), ((297, 15, 297, 68), 'flask.jsonify', 'jsonify', (), '', False, 'from flask import current_app, jsonify\n'), ((320, 8, 320, 35), 'flask.current_app.logger.error', 'current_app.logger.error', ({(320, 33, 320, 34): 'e'}, {}), '(e)', False, 'from flask import current_app, jsonify\n'), ((340, 8, 340, 35), 'flask.current_app.logger.error', 'current_app.logger.error', ({(340, 33, 340, 34): 'e'}, {}), '(e)', False, 'from flask import current_app, jsonify\n'), ((368, 19, 368, 76), 'flask.render_template', 'render_template', (), '', False, 'from flask import render_template\n'), ((372, 19, 372, 42), 'info.models.News.query.get', 'News.query.get', ({(372, 34, 372, 41): 'news_id'}, {}), '(news_id)', False, 'from info.models import User, Category, News\n'), ((380, 19, 380, 76), 'flask.render_template', 'render_template', (), '', False, 'from flask import render_template\n'), ((413, 8, 413, 35), 'flask.current_app.logger.error', 'current_app.logger.error', ({(413, 33, 413, 34): 'e'}, {}), '(e)', False, 'from flask import current_app, jsonify\n'), ((426, 18, 426, 38), 'info.utils.image_storage.storage', 'storage', ({(426, 26, 426, 37): 'index_image'}, {}), '(index_image)', False, 'from info.utils.image_storage import storage\n'), ((442, 8, 442, 35), 'flask.current_app.logger.error', 'current_app.logger.error', ({(442, 33, 442, 34): 'e'}, {}), '(e)', False, 'from flask import current_app, jsonify\n'), ((443, 8, 443, 29), 'info.db.session.rollback', 'db.session.rollback', ({}, {}), '()', False, 'from info import constants, db\n'), ((444, 15, 444, 68), 'flask.jsonify', 'jsonify', (), '', False, 'from flask import current_app, jsonify\n'), ((482, 23, 482, 54), 'info.models.Category.query.get', 'Category.query.get', ({(482, 42, 482, 53): 'category_id'}, {}), '(category_id)', False, 'from info.models import User, Category, News\n'), ((488, 19, 488, 79), 'flask.jsonify', 'jsonify', (), '', False, 'from flask import current_app, jsonify\n'), ((496, 27, 496, 37), 'info.models.Category', 'Category', ({}, {}), '()', False, 'from info.models import User, Category, News\n'), ((499, 12, 499, 40), 'info.db.session.add', 'db.session.add', ({(499, 27, 499, 39): 'new_category'}, {}), '(new_category)', False, 'from info import constants, db\n'), ((500, 12, 500, 31), 'info.db.session.commit', 'db.session.commit', ({}, {}), '()', False, 'from info import constants, db\n'), ((35, 28, 35, 50), 'flask.url_for', 'url_for', ({(35, 36, 35, 49): '"""admin_index"""'}, {}), "('admin_index')", False, 'from flask import url_for\n'), ((45, 15, 45, 57), 'info.models.User.query.filter', 'User.query.filter', ({(45, 33, 45, 56): 'User.mobile == username'}, {}), '(User.mobile == username)', False, 'from info.models import User, Category, News\n'), ((92, 22, 92, 63), 'info.models.User.query.filter', 'User.query.filter', ({(92, 40, 92, 62): 'User.is_admin == False'}, {}), '(User.is_admin == False)', False, 'from info.models import User, Category, News\n'), ((102, 20, 103, 72), 'info.models.User.query.filter', 'User.query.filter', ({(102, 38, 102, 58): 'User.is_admin == False', (103, 38, 103, 71): 'User.create_time > mon_begin_date'}, {}), '(User.is_admin == False, User.create_time > mon_begin_date)', False, 'from info.models import User, Category, News\n'), ((111, 20, 112, 73), 'info.models.User.query.filter', 'User.query.filter', ({(111, 38, 111, 58): 'User.is_admin == False', (112, 38, 112, 72): 'User.create_time >= day_begin_date'}, {}), '(User.is_admin == False, User.create_time >= day_begin_date)', False, 'from info.models import User, Category, News\n'), ((118, 33, 118, 47), 'datetime.datetime.now', 'datetime.now', ({}, {}), '()', False, 'from datetime import datetime, timedelta\n'), ((136, 12, 136, 39), 'flask.current_app.logger.error', 'current_app.logger.error', ({(136, 37, 136, 38): 'e'}, {}), '(e)', False, 'from flask import current_app, jsonify\n'), ((209, 27, 209, 56), 'info.models.News.title.contains', 'News.title.contains', ({(209, 47, 209, 55): 'keywords'}, {}), '(keywords)', False, 'from info.models import User, Category, News\n'), ((247, 12, 247, 39), 'flask.current_app.logger.error', 'current_app.logger.error', ({(247, 37, 247, 38): 'e'}, {}), '(e)', False, 'from flask import current_app, jsonify\n'), ((331, 27, 331, 56), 'info.models.News.title.contains', 'News.title.contains', ({(331, 47, 331, 55): 'keywords'}, {}), '(keywords)', False, 'from info.models import User, Category, News\n'), ((374, 12, 374, 39), 'flask.current_app.logger.error', 'current_app.logger.error', ({(374, 37, 374, 38): 'e'}, {}), '(e)', False, 'from flask import current_app, jsonify\n'), ((422, 19, 422, 69), 'flask.jsonify', 'jsonify', (), '', False, 'from flask import current_app, jsonify\n'), ((428, 12, 428, 39), 'flask.current_app.logger.error', 'current_app.logger.error', ({(428, 37, 428, 38): 'e'}, {}), '(e)', False, 'from flask import current_app, jsonify\n'), ((429, 19, 429, 75), 'flask.jsonify', 'jsonify', (), '', False, 'from flask import current_app, jsonify\n'), ((484, 12, 484, 39), 'flask.current_app.logger.error', 'current_app.logger.error', ({(484, 37, 484, 38): 'e'}, {}), '(e)', False, 'from flask import current_app, jsonify\n'), ((485, 19, 485, 72), 'flask.jsonify', 'jsonify', (), '', False, 'from flask import current_app, jsonify\n'), ((502, 12, 502, 39), 'flask.current_app.logger.error', 'current_app.logger.error', ({(502, 37, 502, 38): 'e'}, {}), '(e)', False, 'from flask import current_app, jsonify\n'), ((503, 12, 503, 33), 'info.db.session.rollback', 'db.session.rollback', ({}, {}), '()', False, 'from info import constants, db\n'), ((504, 19, 504, 72), 'flask.jsonify', 'jsonify', (), '', False, 'from flask import current_app, jsonify\n'), ((131, 20, 133, 64), 'info.models.User.query.filter', 'User.query.filter', ({(131, 38, 131, 60): 'User.is_admin == False', (132, 37, 132, 66): 'User.last_login >= begin_date', (133, 37, 133, 63): 'User.last_login < end_date'}, {}), '(User.is_admin == False, User.last_login >= begin_date, \n    User.last_login < end_date)', False, 'from info.models import User, Category, News\n'), ((168, 22, 168, 44), 'info.models.User.last_login.desc', 'User.last_login.desc', ({}, {}), '()', False, 'from info.models import User, Category, News\n'), ((211, 22, 211, 45), 'info.models.News.create_time.desc', 'News.create_time.desc', ({}, {}), '()', False, 'from info.models import User, Category, News\n'), ((334, 22, 334, 45), 'info.models.News.create_time.desc', 'News.create_time.desc', ({}, {}), '()', False, 'from info.models import User, Category, News\n'), ((167, 19, 167, 60), 'info.models.User.query.filter', 'User.query.filter', ({(167, 37, 167, 59): 'User.is_admin == False'}, {}), '(User.is_admin == False)', False, 'from info.models import User, Category, News\n'), ((210, 19, 210, 46), 'info.models.News.query.filter', 'News.query.filter', ({(210, 37, 210, 45): '*filters'}, {}), '(*filters)', False, 'from info.models import User, Category, News\n'), ((333, 19, 333, 46), 'info.models.News.query.filter', 'News.query.filter', ({(333, 37, 333, 45): '*filters'}, {}), '(*filters)', False, 'from info.models import User, Category, News\n')]