示例#1
0
def get_post_pr(post_id="",
                other_filter=None,
                is_admin=False,
                *args,
                **kwargs):
    """
    获取一个Post
    :param post_id:
    :param other_filter:
    :param is_admin: 是admin用户获取, 可以获取未公开的post
    :param args:
    :param kwargs:
    :return:
    """
    data = {}
    query_conditions = {}
    print("query_conditions:", query_conditions)
    if isinstance(other_filter, dict):
        query_conditions = deepcopy(other_filter)

    query_conditions["_id"] = ObjectId(post_id)

    post = mdbs["web"].db.post.find_one(query_conditions)
    if post:
        if not is_admin:
            if not post["issued"] or post[
                    "is_delete"] or post["audit_score"] >= get_config(
                        "content_inspection", "ALLEGED_ILLEGAL_SCORE"):
                # 未公开的
                if not current_user.is_authenticated or current_user.str_id != str(
                        post["user_id"]):
                    # 没有权限访问
                    abort(401)

        post = objid_to_str(post, ["_id", "user_id", "audit_user_id"])
        post["cover_url"] = get_file_url(post["cover_url"])
        imgs_l = len(post["imgs"])
        if imgs_l:
            for i, img in enumerate(post["imgs"]):
                post["imgs"][i] = get_file_url(img)

        s, r = get_user_public_info(
            user_id=post["user_id"],
            is_basic=False,
            current_user_isauth=current_user.is_authenticated)
        if s:
            post["user"] = r
        data["post"] = post
        if "category" in post and post["category"]:
            category = mdbs["web"].db.category.find_one(
                {"_id": ObjectId(str(post["category"]))})
            if category:
                data["post"]["category_name"] = category["name"]

        if current_user.is_authenticated and current_user.str_id in post[
                "like_user_id"]:
            post["like_it_already"] = True
    else:
        abort(404)
    return data
示例#2
0
def get_posts_query(query_conditions, field, sort, pre, page, get_userinfo):
    """
    提供查询条件等获取文章
    :param query_conditions:
    :param field:
    :param sort:
    :param pre:
    :param page:
    :param get_userinfo:
    :return:
    """
    data = {}
    if field:
        ps = mdbs["web"].db.post.find(query_conditions, field)
    else:
        ps = mdbs["web"].db.post.find(query_conditions)

    data_cnt = ps.count(True)
    posts = list(ps.sort(sort).skip(pre * (page - 1)).limit(pre))
    for post in posts:
        post = objid_to_str(post, ["_id", "user_id", "audit_user_id"])
        # image
        if "cover_url" in post and post["cover_url"]:
            post["cover_url"] = get_file_url(post["cover_url"])
        if "imgs" in post and len(post["imgs"]):

            for i, img in enumerate(post["imgs"]):
                post["imgs"][i] = get_file_url(img)

        if "user_id" not in query_conditions.keys() and get_userinfo:
            s, r = get_user_public_info(
                user_id=post["user_id"],
                is_basic=False,
                current_user_isauth=current_user.is_authenticated)
            if s:
                post["user"] = r
            else:
                post['user'] = {}
        # category
        if "category" in post and post["category"]:
            post["category"] = str(post["category"])
            category = mdbs["web"].db.category.find_one(
                {"_id": ObjectId(post["category"])})
            if category:
                post["category_name"] = category["name"]

    data["posts"] = datas_paging(
        pre=pre,
        page_num=page,
        data_cnt=data_cnt,
        datas=posts)
    return data
示例#3
0
def get_display_setting():
    '''
    :param user_id: 媒体为管理端(系统)所有时需要传入user_id = 0
    :return:
    '''

    user_id = 0
    id = request.argget.all("id")

    s, r = arg_verify([("id", id)], required=True)
    if not s:
        return r

    data = {}

    display_setting = mdb_sys.db.theme_display_setting.find_one({
        "_id":
        ObjectId(id),
        "user_id":
        user_id
    })
    if display_setting:
        display_setting["_id"] = str(display_setting["_id"])
        if "url" in display_setting and display_setting["url"]:
            display_setting["url"] = get_file_url(display_setting["url"])

    data["media"] = display_setting
    return data
示例#4
0
def get_display_setting():
    """
    :param user_id: 媒体为管理端(系统)所有时需要传入user_id = 0
    :return:
    """

    tid = request.argget.all("id")

    s, r = arg_verify([("id", tid)], required=True)
    if not s:
        return r

    data = {}
    theme_name = get_config("theme", "CURRENT_THEME_NAME")
    display_setting = mdbs["sys"].db.theme_display_setting.find_one({
        "_id":
        ObjectId(tid),
        "theme_name":
        theme_name
    })
    if display_setting:
        display_setting["_id"] = str(display_setting["_id"])
        if "url" in display_setting and display_setting["url"]:
            display_setting["url"] = get_file_url(display_setting["url"])

    data["media"] = display_setting
    data["theme_name"] = theme_name
    return data
示例#5
0
def get_user_all_info(**kwargs):
    '''
    获取用户全部信息, 密码除外
    注意, 函数中不要写默认参数,使用kwargs, 方便更新用户数据时清理缓存
    :param user_id:
    :param is_basic: 默认False, 为Ture时只返回最基础的数据
    :param determine_following:判断当前登录用户是否有关注该用户, 前提是is_basic参数为False
    :return:
    '''

    print("==============All info 没缓存")
    user_id = kwargs.get("user_id")
    is_basic = kwargs.get("is_basic", 0)
    determine_following = kwargs.get("determine_following", True)

    user = mdb_user.db.user.find_one({"_id": ObjectId(user_id)},
                                     {"password": 0})
    if not user:
        return False, gettext("The specified user is not found")
    else:
        user["_id"] = str(user["_id"])
        user["avatar_url"]["url"] = get_file_url(user["avatar_url"])
        if not is_basic:
            user["follow"] = get_user_follow_data(
                user["_id"], determine_following=determine_following)
            # 登录日志
            user["user_login_log"] = []
            user_login_log = mdb_user.db.user_login_log.find_one(
                {"user_id": user["_id"]}, {"user_id": 0})
            user["user_login_log"] = []
            if user_login_log:
                user_login_log["_id"] = str(user_login_log["_id"])
                user["user_login_log"] = user_login_log
        return True, user
示例#6
0
def get_user_public_info(**kwargs):
    '''
    获取用户公开信息
    注意, 函数中不要写默认参数,使用kwargs, 方便更新用户数据时清理缓存
    :param user_id:
    :param is_basic: 默认False, 为Ture时只返回最基础的数据
    :param determine_following:判断当前登录用户是否有关注该用户, 前提是is_basic参数为False
    :return:
    '''
    print("==============Public info 没缓存")
    user_id = kwargs.get("user_id")
    is_basic = kwargs.get("is_basic", 0)
    determine_following = kwargs.get("determine_following", True)
    user = mdb_user.db.user.find_one({"_id": ObjectId(user_id)}, {
        "username": 1,
        "custom_domain": 1,
        "avatar_url": 1,
        "introduction": 1,
        "gender": 1
    })
    if not user:
        return False, gettext("The specified user is not found")
    else:
        user["_id"] = str(user["_id"])
        user["custom_domain"] = str(user["custom_domain"])
        user["avatar_url"]["url"] = get_file_url(user["avatar_url"])
        if not is_basic:
            print("=====")
            user["follow"] = get_user_follow_data(
                user["_id"], determine_following=determine_following)
        return True, user
示例#7
0
def get_medias(user_id=None):
    """
    :param user_id: 媒体为管理端(系统)所有时需要传入user_id = 0
    :return:
    """

    if user_id is None:
        user_id = current_user.str_id
    keyword = request.argget.all("keyword")
    category_id = request.argget.all("category_id")
    ctype = request.argget.all("ctype")
    page = str_to_num(request.argget.all("page", 1))
    pre = str_to_num(request.argget.all("pre", 12))
    sort = json_to_pyseq(request.argget.all('sort'))
    s, r = arg_verify([(gettext("type"), ctype)],
                      only=get_config("category", "CATEGORY_TYPE").values())
    if not s:
        return r

    data = {}
    if category_id:
        if category_id == "default":
            category_id = {"$in": [None, ""]}
        query = {"category_id": category_id, "type": ctype}
    else:
        query = {"type": ctype}

    if keyword:
        k_rule = {"$regex": keyword, "$options": "$i"}
        query["$or"] = [{
            "name": k_rule
        }, {
            "title": k_rule
        }, {
            "link": k_rule
        }, {
            "text": k_rule
        }]
    query["user_id"] = user_id

    # sort
    if sort:
        for i, srt in enumerate(sort):
            sort[i] = (list(srt.keys())[0], list(srt.values())[0])
    else:
        sort = [("time", -1)]

    medias = mdb_web.db.media.find(query)
    data_cnt = medias.count(True)
    medias = list(medias.sort(sort).skip(pre * (page - 1)).limit(pre))
    for d in medias:
        d["_id"] = str(d["_id"])
        if "url" in d and d["url"]:
            d["url"] = get_file_url(d["url"])

    data["medias"] = datas_paging(pre=pre,
                                  page_num=page,
                                  data_cnt=data_cnt,
                                  datas=medias)
    return data
示例#8
0
def get_media(user_id=None):
    """
    :param user_id: 媒体为管理端(系统)所有时需要传入user_id = 0
    :return:
    """

    if user_id is None:
        user_id = current_user.str_id
    tid = request.argget.all("id")

    s, r = arg_verify([("id", tid)], required=True)
    if not s:
        return r

    data = {}

    media = mdb_web.db.media.find_one({
        "_id": ObjectId(tid),
        "user_id": user_id
    })
    if media:
        media["_id"] = str(media["_id"])
        if "url" in media and media["url"]:
            media["url"] = get_file_url(media["url"])

    data["media"] = media
    return data
示例#9
0
def get_display_settings():
    """
    :return:
    """

    keyword = request.argget.all("keyword")
    category_id = request.argget.all("category_id")
    ctype = request.argget.all("ctype")
    page = str_to_num(request.argget.all("page", 1))
    pre = str_to_num(request.argget.all("pre", 12))
    sort = json_to_pyseq(request.argget.all('sort'))
    s, r = arg_verify([(gettext("type"), ctype)],
                      only=get_config("category", "CATEGORY_TYPE").values())
    if not s:
        return r

    data = {}
    if category_id:
        if category_id == "default":
            category_id = {"$in": [None, ""]}
        query = {"category_id": category_id, "type": ctype}
    else:
        query = {"type": ctype}

    if keyword:
        k_rule = {"$regex": keyword, "$options": "$i"}
        query["$or"] = [{
            "name": k_rule
        }, {
            "title": k_rule
        }, {
            "link": k_rule
        }, {
            "text": k_rule
        }]
    theme_name = get_config("theme", "CURRENT_THEME_NAME")
    query["theme_name"] = theme_name
    # sort
    if sort:
        for i, srt in enumerate(sort):
            sort[i] = (list(srt.keys())[0], list(srt.values())[0])
    else:
        sort = [("time", -1)]

    display_settings = mdbs["sys"].db.theme_display_setting.find(query)
    data_cnt = display_settings.count(True)
    display_settings = list(
        display_settings.sort(sort).skip(pre * (page - 1)).limit(pre))
    for d in display_settings:
        d["_id"] = str(d["_id"])
        if "url" in d and d["url"]:
            d["url"] = get_file_url(d["url"])

    data["medias"] = datas_paging(pre=pre,
                                  page_num=page,
                                  data_cnt=data_cnt,
                                  datas=display_settings)
    data["theme_name"] = theme_name
    return data
示例#10
0
def avatar_upload():
    '''
    头像上传
    :return:
    '''
    result = None
    imgfile_base = request.argget.all("imgfile_base")
    if imgfile_base:
        result = fileup_base_64(uploaded_files = [imgfile_base], prefix="user_avatar/")
    else:
        file = request.files['imgfile']
        if file:
            tailoring = request.argget.all('tailoring')
            if tailoring:
                if not isinstance(tailoring, dict):
                    tailoring = json.loads(tailoring)
                for k in ["width", "height", "x", "y", "rotate"]:
                    tailoring.setdefault(k, 0)
            result = file_up(uploaded_files=[file], prefix="user_avatar/", tailoring=tailoring)

    data = {}
    if result:
        result = result[0]
        user = mdb_user.db.user.find_one({"_id":current_user.id})
        if user:
            if result["key"] != user['avatar_url']["key"]:
                # 当使用了不同的名字删除老的头像
                file_del(user['avatar_url'])

            update_data = {
                "avatar_url" : result
            }
            r = mdb_user.db.user.update_one({"_id":current_user.id}, {"$set":update_data})
            if not r.matched_count:
                data = {'msg':gettext("Save failed"), 'msg_type':"w", "http_status":400}
            else:
                if result["type"] == "local":
                    # 如果保存再本地的话, 保存为一定尺寸大小
                    path = "{}{}".format(APPS_PATH, get_file_url(result))
                    imgcp = ImageCompression(path, path)
                    ava_size = get_config("account", "USER_AVATAR_SIZE")
                    imgcp.custom_pixels(ava_size[0], ava_size[1])

                data = {'msg':gettext("Save successfully"), 'msg_type':"s", "http_status":201}
    if not data:
        data = {'msg':gettext("Upload failed"), 'msg_type':"w", "http_status":400}
    return data
示例#11
0
文件: file_up.py 项目: txf626/osroom
def call_file_detection(files_file_url_obj):
    '''
    调用文件检查
    :param file_urls:
    :return:
    '''

    for file_url_obj in files_file_url_obj:
        url = get_file_url(file_url_obj)
        r = content_inspection_image(url=url)
        if r['score'] >= get_config("content_inspection", "ALLEGED_ILLEGAL_SCORE"):
            # 违规
            file_del(file_url_obj)
            replica_file_path_list = os.path.splitext(file_url_obj["key"])
            copy_file(from_path=VIOLATION_IMG_PATH,
                      replica_file_name=replica_file_path_list[0],
                      replica_file_format=replica_file_path_list[-1].lstrip("."))
示例#12
0
文件: user.py 项目: zhubaoming/osroom
    def __init__(self, id, **kwargs):
        super(User, self).__init__(**kwargs)
        id = ObjectId(id)
        user = mdb_user.db.user.find_one({"_id": id})
        if user:
            if "password" in user and user["password"]:
                self.no_password = False
                del user["password"]
            else:
                self.no_password = True

            self.id = id
            self.str_id = str(id)
            self.username = user["username"]
            self.email = user["email"]
            self.mphone_num = user["mphone_num"]
            self.custom_domain = user["custom_domain"]
            self.gender = user["gender"]
            self.avatar_url = get_file_url(user["avatar_url"])
            self.role_id = ObjectId(user["role_id"])
            self.active = user["active"]
            self.is_delete = user["is_delete"]
            self.create_at = user["create_at"]
            self.update = user["update_at"]
            self.editor = user["editor"]
            self.jwt_login_time = user.get("jwt_login_time", None)
            if not self.mphone_num:
                user_info_mphone_num = None
            else:
                temp_num = str(self.mphone_num)
                user_info_mphone_num = "{}****{}".format(
                    temp_num[0:3], temp_num[-5:-1]),
            self.user_info = {
                "username": self.username,
                "active": self.active,
                "is_delete": self.is_delete,
                "email": self.email,
                "mphone_num": user_info_mphone_num,
                "custom_domain": self.custom_domain,
                "avatar_url": self.avatar_url,
                "role_id": self.role_id,
                "id": self.id
            }
        else:
            return
示例#13
0
def clean_tempfile(user_id, type, old_file=[], keey_file=[]):
    """
    清理数据库中tempfile文档中保存的临时文件
    :param user_id: 用户ID
    :param type: 临时文件类型
    :param old_file: 已存在, 但不知是否在保留文件中的文件
    :param keey_file: 当前临时文件中需要保留的文件
    :return:
    """

    tempfiles = mdbs["web"].db.tempfile.find({
        "type": type,
        "user_id": user_id
    })
    files = []

    # 找出被上传后没有使用的图片:
    temppaths = []
    for tempfile in tempfiles:
        temppaths.extend(tempfile["paths"])

    temppaths.extend(old_file)
    need_rm_files = temppaths[:]
    for img in temppaths:
        path = get_file_url(img)
        if not path:
            continue
        for src in keey_file:
            if not src:
                continue
            if path.lower() in src.lower():
                files.append(img)
                need_rm_files.remove(img)
                break

    # 文章中没有的图片就删除
    for rf in need_rm_files:
        file_del(rf)

    # 更tempfile数据库的的数据
    mdbs["web"].db.tempfile.delete_many({"type": type, "user_id": user_id})
    return files
示例#14
0
def create_img_code(interference=0):
    '''
    生成验证码
    difficulty: 数值越高, 越难辨别,最小为10
    :return:
    '''
    # 240 x 60:
    # 每次生成验证码的同时,我们删除本地过期验证码
    vercode_del(expiration_time=get_config("verify_code", "EXPIRATION"))

    max_in = get_config("verify_code", "MAX_IMG_CODE_INTERFERENCE")
    min_in = get_config("verify_code", "MIN_IMG_CODE_INTERFERENCE")
    if interference < 10:

        if min_in < 10:
            min_in = 10
        if min_in > max_in:
            temp_max_in = max_in
            max_in = min_in
            min_in = temp_max_in
        else:
            min_in = 10
            max_in = 30
        interference = random.randint(min_in, max_in)

    # 验证码尺寸
    width = 60 * 4
    height = 60
    pic = CreateImgCode(width, height, 'white')
    pic.create_pic()
    pic.create_point(interference * 50)
    pic.create_line(interference * 3)

    # 生成随机码写入
    _str = ""
    for t in range(4):
        c = random_char()
        _str = "{}{}".format(_str, c)
    pic.create_text(FONT_PATH, 24, _str)

    # 扭曲
    # pic.istortion_shift()

    # 保存路径
    local_dirname = get_config("upload", "IMG_VER_CODE_DIR")
    save_dir = "{}/{}".format(STATIC_PATH, local_dirname).replace("//", "/")
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    code_img = '{}__{}.jpg'.format(time.time(), uuid1())
    save_img = '{}/{}'.format(save_dir, code_img)

    # 保存
    pic.img.save(save_img, 'jpeg')

    # 检图床插件
    data = plugin_manager.call_plug(hook_name="file_storage",
                                    action="upload",
                                    localfile_path=save_img,
                                    filename=code_img)

    if data == "__no_plugin__":

        code_url_info = {"key": code_img, "type": "local"}
    else:
        code_url_info = data
        # 使用了第三方插件存储,则删除本地验证码
        local_file_del(path=save_img)

    _code = {
        'url': code_url_info,
        'str': _str,
        'time': time.time(),
        "type": "image"
    }
    mdb_web.db.verify_code.insert_one(_code)
    _code.pop('_id')
    _code.pop('str')
    _code['img_url_obj'] = _code['url']
    _code['url'] = get_file_url(code_url_info, save_dir=local_dirname)
    return _code
示例#15
0
def get_global_media(dbname, collname):
    """

    根据conditions, category_name
    获取media或theme_display_setting中的数据
    :param dbname:
    :param collname:
    :return:
    """
    mdb = mdbs[dbname]
    conditions = json_to_pyseq(request.argget.all("conditions", []))
    category_name = json_to_pyseq(request.argget.all("category_name", []))
    media_id = request.argget.all("media_id")

    medias = {}
    if collname == "theme_display_setting":
        q = {"theme_name": get_config("theme", "CURRENT_THEME_NAME")}
    else:
        q = {}

    if media_id:
        q["_id"] = ObjectId(media_id)
        media = mdb.dbs[collname].find_one(q)
        media["_id"] = str(media["_id"])
        media["url"] = get_file_url(media["url"])
        data = {"media": media}
        return data

    elif category_name and collname == "media":
        # collname == "media" 的时候
        # 获取指定category_name user_id type的media
        category_user_id = request.argget.all("category_user_id", 0)
        category_type = request.argget.all("category_type")
        page = str_to_num(request.argget.all("page", 1))
        pre = str_to_num(request.argget.all("pre", 8))

        categorys = mdbs["web"].db.category.find(
            {
                "type": category_type,
                "user_id": category_user_id,
                "name": {
                    "$in": category_name
                }
            }, {"_id": 1})

        category_ids = []
        for category in categorys:
            category_ids.append(str(category["_id"]))

        sort = [("time", -1)]

        q["category_id"] = {"$in": category_ids}
        medias = mdb.dbs[collname].find(q)

        data_cnt = medias.count(True)
        medias = list(medias.sort(sort).skip(pre * (page - 1)).limit(pre))
        for d in medias:
            d["_id"] = str(d["_id"])
            if "url" in d and d["url"]:
                d["url"] = get_file_url(d["url"])
        medias = datas_paging(pre=pre,
                              page_num=page,
                              data_cnt=data_cnt,
                              datas=medias)
    else:
        for condition in conditions:
            if "name_regex" in condition and condition["name_regex"]:
                q["type"] = condition["type"]
                q["name"] = {
                    "$regex": condition["name_regex"],
                    "$options": "$i"
                }
                temp_media = list(mdb.dbs[collname].find(q).sort([("name", 1)
                                                                  ]))
            else:
                q["type"] = condition["type"]
                q["name"] = {"$in": condition["names"]}

                temp_media = list(mdb.dbs[collname].find(q).sort([("name", 1)
                                                                  ]))

            for d in temp_media:
                d["_id"] = str(d["_id"])
                if "url" in d and d["url"]:
                    d["url"] = get_file_url(d["url"])
            medias[condition["result_key"]] = temp_media
    data = {"medias": medias}
    return data
示例#16
0
def search_process():
    '''
    搜索(暂不支持全文搜索)
    只能搜索文章, 用户
    :return:
    '''

    keyword = request.argget.all('keyword')
    target = request.argget.all('target')
    page = str_to_num(request.argget.all('page', 1))
    pre = str_to_num(request.argget.all('pre', 10))

    s, r = arg_verify(reqargs=[(gettext("keyword"), keyword)], required=True)
    if not s:
        return r

    data = {"posts": {}, "users": {}}
    # post
    if not target or target == "post":
        data["posts"] = {}
        data["posts"]["items"] = get_posts_pr(field={
            "title": 1,
            "issue_time": 1,
            "brief_content": 1
        },
                                              page=page,
                                              pre=pre,
                                              status="is_issued",
                                              sort=None,
                                              time_range=None,
                                              matching_rec=None,
                                              keyword=keyword,
                                              other_filter=None,
                                              is_admin=False,
                                              get_userinfo=False)["posts"]
        data["posts"]["kw"] = keyword

    if not target or target == "user":
        # user
        data["users"] = {"kw": keyword, "items": []}
        query_conditions = {
            "is_delete": {
                "$in": [False, 0]
            },
            "active": {
                "$in": [True, 1]
            }
        }
        keyword = {"$regex": keyword, "$options": "$i"}
        query_conditions["$or"] = [{
            "username": keyword
        }, {
            "email": keyword
        }, {
            "custom_domain": keyword
        }]
        us = mdb_user.db.user.find(
            query_conditions, {
                "_id": 1,
                "username": 1,
                "avatar_url": 1,
                "custom_domain": 1,
                "gender": 1,
            })

        data_cnt = us.count(True)
        users = list(us.skip(pre * (page - 1)).limit(pre))
        for user in users:
            user['_id'] = str(user['_id'])
            user["avatar_url"]["url"] = get_file_url(user["avatar_url"])

        data["users"]["items"] = datas_paging(pre=pre,
                                              page_num=page,
                                              data_cnt=data_cnt,
                                              datas=users)

    return data
示例#17
0
def avatar_upload():
    """
    头像上传
    :return:
    """
    result = None
    imgfile_base = request.argget.all("imgfile_base")
    max_size_mb = get_config("account", "USER_AVATAR_MAX_SIZE")
    max_size_b = max_size_mb * 1024 * 1024
    if imgfile_base:
        if len(imgfile_base) > max_size_b:
            data = {
                "msg":
                gettext("Upload avatar image can not exceed {}M".format(
                    max_size_mb)),
                "msg_type":
                "w",
                "http_status":
                413
            }
            return data
        else:
            result = fileup_base_64(uploaded_files=[imgfile_base],
                                    prefix="user_avatar/")
    else:
        file = request.files['upfile']
        if len(file.read()) > max_size_b:
            data = {
                "msg":
                gettext("Upload avatar image can not exceed {}M".format(
                    max_size_mb)),
                "msg_type":
                "w",
                "http_status":
                413
            }
            return data

        if file:
            tailoring = request.argget.all('tailoring')
            if tailoring:
                if not isinstance(tailoring, dict):
                    tailoring = json.loads(tailoring)
                for k in ["width", "height", "x", "y", "rotate"]:
                    tailoring.setdefault(k, 0)
            result = file_up(uploaded_files=[file],
                             prefix="user_avatar/",
                             tailoring=tailoring)

    data = {}
    if result:
        result = result[0]
        user = get_one_user(user_id=current_user.str_id)
        if user:
            if user['avatar_url'] and "key" in user['avatar_url'] \
                    and result["key"] != user['avatar_url']["key"]:
                # 当使用了不同的名字删除老的头像
                file_del(user['avatar_url'])

            update_data = {"avatar_url": result}
            r = update_one_user(user_id=current_user.str_id,
                                updata={"$set": update_data})
            if not r.matched_count:
                data = {
                    'msg': gettext("Save failed"),
                    'msg_type': "w",
                    "http_status": 400
                }
            else:
                if result["type"] == "local":
                    # 如果保存再本地的话, 保存为一定尺寸大小
                    path = "{}{}".format(APPS_PATH, get_file_url(result))
                    imgcp = ImageCompression(path, path)
                    ava_size = get_config("account", "USER_AVATAR_SIZE")
                    imgcp.custom_pixels(ava_size[0], ava_size[1])
                data = {
                    'msg': gettext("Save successfully"),
                    'msg_type': "s",
                    "http_status": 201
                }
    if not data:
        data = {
            'msg': gettext("Upload failed"),
            'msg_type': "w",
            "http_status": 400
        }

    # 清理user信息数据缓存
    delete_user_info_cache(user_id=current_user.str_id)
    return data
示例#18
0
def file_upload(return_url_key="urls", return_state_key="state", return_success="success",
                return_error="error", save_temporary_url=False, file_type="image", return_key=False, prefix=""):

    try:
        return_success = int(return_success)
    except:
        pass
    try:
        return_error = int(return_error)
    except:
        pass
    if request.files:
        files = request.files.values()
        if files:

            r = file_up(files, prefix=prefix, file_name=None)
            if r:
                urls = []
                if save_temporary_url:
                    for key in r:
                        if key:
                            r1 = mdb_web.db.tempfile.update_one({"type":file_type,
                                                             "user_id":current_user.str_id},
                                                            {"$addToSet":{"paths":key}},
                                                            upsert=True)
                            if not r1.modified_count:
                                mdb_web.db.tempfile.insert_one({"type":file_type,
                                                            "user_id":current_user.str_id,
                                                            "paths":[key]})
                            urls.append(get_file_url(key))
                else:
                    for key in r:
                        if key:
                            urls.append(get_file_url(key))
                if urls:
                    data = {return_url_key: urls,
                            return_state_key: return_success,
                            "msg": gettext("Uploaded successfully"),
                            "msg_type": "s", "http_status": 201}
                    if return_key:
                        data["keys"] = r
                else:
                    data = {
                        return_state_key: return_error,
                        "msg": gettext("Upload failed"),
                        "msg_type": "e", "http_status": 400
                    }

            else:
                data = {
                        return_state_key:return_error,
                        "msg":gettext("Get file error"),
                        "msg_type":"e", "http_status":400
                }
        else:
            data = {return_state_key:return_error,"msg":gettext("Get file error"),
                    "msg_type":"e", "http_status":400}
    else:
        data = {return_state_key:return_error,"msg":gettext("No file submitted"),
                "msg_type":"e", "http_status":400}
    return data
示例#19
0
def get_global_media():
    '''
    根据conditions获取category_name获取media
    :return:
    '''

    conditions = json_to_pyseq(request.argget.all("conditions", []))
    category_name = json_to_pyseq(request.argget.all("category_name", []))
    media_id = request.argget.all("media_id")

    medias = {}
    if media_id:
        media = mdb_web.db.media.find_one({"_id": ObjectId(media_id)})
        media["_id"] = str(media["_id"])
        media["url"] = get_file_url(media["url"])
        data = {"media": media}
        return data

    elif category_name:
        # 获取指定category_name user_id type的media
        category_user_id = request.argget.all("category_user_id", 0)
        category_type = request.argget.all("category_type")
        page = str_to_num(request.argget.all("page", 1))
        pre = str_to_num(request.argget.all("pre", 8))
        categorys = mdb_web.db.category.find(
            {
                "type": category_type,
                "user_id": category_user_id,
                "name": {
                    "$in": category_name
                }
            }, {"_id": 1})

        category_ids = []
        for category in categorys:
            category_ids.append(str(category["_id"]))

        sort = [("time", -1)]
        medias = mdb_web.db.media.find({"category_id": {"$in": category_ids}})
        data_cnt = medias.count(True)
        medias = list(medias.sort(sort).skip(pre * (page - 1)).limit(pre))
        for d in medias:
            d["_id"] = str(d["_id"])
            if "url" in d and d["url"]:
                d["url"] = get_file_url(d["url"])
        medias = datas_paging(pre=pre,
                              page_num=page,
                              data_cnt=data_cnt,
                              datas=medias)

    else:
        for condition in conditions:
            if "name_regex" in condition and condition["name_regex"]:
                temp_media = list(
                    mdb_web.db.media.find({
                        "type": condition["type"],
                        "name": {
                            "$regex": condition["name_regex"],
                            "$options": "$i"
                        }
                    }).sort([("name", 1)]))
            else:
                temp_media = list(
                    mdb_web.db.media.find({
                        "type": condition["type"],
                        "name": {
                            "$in": condition["names"]
                        }
                    }).sort([("name", 1)]))
            for d in temp_media:
                d["_id"] = str(d["_id"])
                if "url" in d and d["url"]:
                    d["url"] = get_file_url(d["url"])
            medias[condition["result_key"]] = temp_media
    data = {"medias": medias}
    return data
示例#20
0
def get_posts_pr(field=None,
                 page=1,
                 pre=10,
                 status="is_issued",
                 sort=None,
                 time_range=None,
                 matching_rec=None,
                 keyword=None,
                 other_filter=None,
                 is_admin=False,
                 *args,
                 **kwargs):
    '''
    获取一些指定的post
    :param field:
    :param page:
    :param pre:
    :param status:
    :param sort:
    :param time_range:
    :param matching_rec:
    :param keyword:
    :param other_filter:
    :param is_admin: 是admin用户获取, 可以获取未公开的post
    :param args:
    :param kwargs:
    :return:
    '''

    data = {}
    if pre > get_config("post", "NUM_PAGE_MAX"):
        data = {
            "msg": gettext('The "pre" must not exceed the maximum amount'),
            "msg_type": "e",
            "http_status": 400
        }
        return data
    query_conditions = {}
    if other_filter:
        query_conditions = deepcopy(other_filter)

    if status and status != "is_issued" and not is_admin:
        # 非admin用户获取未公开post, 需要认证
        if not current_user.is_authenticated:
            # 未登录用户
            abort(401)
        elif "user_id" in query_conditions:
            if query_conditions["user_id"] != current_user.str_id:
                # 要获取的user_id不是当前用户
                abort(401)
        else:
            # 默认获取当前用户
            query_conditions["user_id"] = current_user.str_id

    if status == "no_issued":
        query_conditions['$or'] = [
            {
                'issued': 0
            },
            {
                'is_delete': 1
            },
            {
                'audited': 1,
                'audit_score': {
                    "$gte":
                    get_config("content_inspection", "ALLEGED_ILLEGAL_SCORE")
                }
            },
        ]
    elif status == "draft":
        query_conditions['issued'] = 0
        query_conditions['is_delete'] = 0

    elif status == "not_audit":
        query_conditions['issued'] = 1
        query_conditions['is_delete'] = 0
        # 没有审核, 而且默认评分涉嫌违规的
        query_conditions['audited'] = 0
        query_conditions['audit_score'] = {
            "$gte": get_config("content_inspection", "ALLEGED_ILLEGAL_SCORE")
        }

    elif status == "unqualified":
        query_conditions['issued'] = 1
        query_conditions['is_delete'] = 0
        query_conditions['audited'] = 1
        query_conditions['audit_score'] = {
            "$gte": get_config("content_inspection", "ALLEGED_ILLEGAL_SCORE")
        }

    elif status == "recycle":
        query_conditions['is_delete'] = 1

    elif status == "user_remove":
        query_conditions['is_delete'] = {"$in": [2, 3]}

    else:
        query_conditions['issued'] = 1
        query_conditions['is_delete'] = 0
        query_conditions['audit_score'] = {
            "$lt": get_config("content_inspection", "ALLEGED_ILLEGAL_SCORE")
        }

    if keyword:
        keyword = {"$regex": keyword, "$options": "$i"}
        query_conditions["$or"] = [{
            "title": keyword
        }, {
            "content": keyword
        }, {
            "category": keyword
        }, {
            "tag": keyword
        }]
    # sort
    if sort:
        for i in range(0, len(sort)):
            sort[i] = (list(sort[i].keys())[0], list(sort[i].values())[0])
    else:
        sort = [("issue_time", -1), ("update_time", -1)]

    # time_range
    if time_range:
        now_time = time.time()
        gt_time = (now_time - 86400 * (time_range - 1)) - now_time % 86400
        query_conditions["issue_time"] = {'$gt': gt_time}

    if field:
        ps = mdb_web.db.post.find(query_conditions, field)
    else:
        ps = mdb_web.db.post.find(query_conditions)

    data_cnt = ps.count(True)
    posts = list(ps.sort(sort).skip(pre * (page - 1)).limit(pre))

    get_userinfo = kwargs.get("get_userinfo", True)
    for post in posts:
        post = objid_to_str(post, ["_id", "user_id", "audit_user_id"])
        # image
        if "cover_url" in post and post["cover_url"]:
            post["cover_url"] = get_file_url(post["cover_url"])
        if "imgs" in post and len(post["imgs"]):
            for i in range(0, len(post["imgs"])):
                post["imgs"][i] = get_file_url(post["imgs"][i])

        if not "user_id" in query_conditions.keys() and get_userinfo:
            s, r = get_user_public_info(user_id=post["user_id"],
                                        is_basic=False)
            if s:
                post["user"] = r
        # category
        if "category" in post and post["category"]:
            post["category"] = str(post["category"])
            category = mdb_web.db.category.find_one(
                {"_id": ObjectId(post["category"])})
            if category:
                post["category_name"] = category["name"]

    data["posts"] = datas_paging(pre=pre,
                                 page_num=page,
                                 data_cnt=data_cnt,
                                 datas=posts)
    return data
示例#21
0
def users():
    '''
    Admin获取用户数据
    :return:
    '''
    data = {}
    status = request.argget.all('status')
    page = int(request.argget.all('page', 1))
    pre = int(request.argget.all('pre', 10))
    keyword = request.argget.all('keyword', '').strip()
    query_conditions = {}
    if status == "normal" or not status:
        status = "normal"
        query_conditions = {
            "is_delete": {
                "$in": [False, 0]
            },
            "active": {
                "$in": [True, 1]
            }
        }
    elif status == "inactive":
        query_conditions = {
            "is_delete": {
                "$in": [False, 0]
            },
            "active": {
                "$in": [False, 0]
            }
        }
    elif status == "cancelled":
        query_conditions = {"is_delete": {"$in": [True, 1]}}

    if keyword:
        keyword = {"$regex": keyword, "$options": "$i"}
        query_conditions["$or"] = [{
            "username": keyword
        }, {
            "email": keyword
        }, {
            "custom_domain": keyword
        }]
    us = mdb_user.db.user.find(query_conditions, {"password": 0})
    data_cnt = us.count(True)
    users = list(us.skip(pre * (page - 1)).limit(pre))
    roles = list(mdb_user.db.role.find({}))
    for user in users:
        user['_id'] = str(user['_id'])
        for role in roles:
            if ObjectId(user["role_id"]) == role["_id"]:
                user["role_name"] = role["name"]

        user_login_log = mdb_user.db.user_login_log.find_one(
            {"user_id": user["_id"]}, {"user_id": 0})
        user["user_login_log"] = []
        if user_login_log:
            user_login_log["_id"] = str(user_login_log["_id"])
            user_login_log["login_info"] = sorted(user_login_log["login_info"],
                                                  key=lambda x: x["time"],
                                                  reverse=True)
            user["user_login_log"] = user_login_log

        user_op_log = mdb_user.db.user_op_log.find_one(
            {'user_id': user["_id"]}, {"user_id": 0})
        user["user_op_log"] = []
        if user_op_log:
            user_op_log["_id"] = str(user_op_log["_id"])
            user_op_log["logs"] = sorted(user_op_log["logs"],
                                         key=lambda x: x["time"],
                                         reverse=True)
            user["user_op_log"] = user_op_log

        user["role_id"] = str(user["role_id"])
        user["avatar_url"]["url"] = get_file_url(user["avatar_url"])

    data["users"] = datas_paging(pre=pre,
                                 page_num=page,
                                 data_cnt=data_cnt,
                                 datas=users)
    data["status"] = status
    return data
示例#22
0
def create_img_code(interference=0):
    """
    生成验证码
    difficulty: 数值越高, 越难辨别,最小为10
    :return:
    """
    # 240 x 60:
    # 每次生成验证码的同时,我们删除本地过期验证码
    vercode_del(expiration_time=get_config("verify_code", "EXPIRATION"))

    _str = ""
    for t in range(4):
        c = random_char()
        _str = "{}{}".format(_str, c)

    # 使用ImageCaptcha验证码生成程序
    image = ImageCaptcha()
    image.generate(_str)

    # 保存路径
    local_dirname = get_config("verify_code", "IMG_CODE_DIR")
    save_dir = "{}/{}".format(STATIC_PATH, local_dirname).replace("//", "/")
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    code_img = '{}__{}.png'.format(time.time(), uuid1())
    save_img = '{}/{}'.format(save_dir, code_img)
    image.write(_str, save_img)

    # osroom 验证码程序
    # max_in = get_config("verify_code", "MAX_IMG_CODE_INTERFERENCE")
    # min_in = get_config("verify_code", "MIN_IMG_CODE_INTERFERENCE")
    # if interference < 10:
    #
    #     if min_in < 10:
    #         min_in = 10
    #     if min_in > max_in:
    #         temp_max_in = max_in
    #         max_in = min_in
    #         min_in = temp_max_in
    #     else:
    #         min_in = 10
    #         max_in = 30
    #     interference = random.randint(min_in, max_in)
    #
    # # 验证码尺寸
    # width = 60 * 4
    # height = 60
    # pic = CreateImgCode(width, height, 'white')
    # pic.create_pic()
    # pic.create_point(interference * 50)
    # pic.create_line(interference * 3)

    # 生成随机码写入
    # _str = ""
    # for t in range(4):
    #     c = random_char()
    #     _str = "{}{}".format(_str, c)
    # pic.create_text(FONT_PATH, 24, _str)
    #
    # # 扭曲
    # # pic.istortion_shift()
    #
    # 保存路径
    # local_dirname = get_config("verify_code", "IMG_CODE_DIR")
    # save_dir = "{}/{}".format(STATIC_PATH, local_dirname).replace("//", "/")
    # if not os.path.exists(save_dir):
    #     os.makedirs(save_dir)
    # code_img = '{}__{}.jpg'.format(time.time(), uuid1())
    # save_img = '{}/{}'.format(save_dir, code_img)
    #
    # # 保存
    # pic.img.save(save_img, 'jpeg')

    # 检图床插件
    data = plugin_manager.call_plug(hook_name="file_storage",
                                    action="upload",
                                    localfile_path=save_img,
                                    filename="{}/{}".format(
                                        local_dirname, code_img))

    if data == "__no_plugin__":

        code_url_info = {"key": code_img, "type": "local"}
    else:
        code_url_info = data
        # 使用了第三方插件存储,则删除本地验证码
        local_file_del(path=save_img)

    _code = {
        'url': code_url_info,
        'str': _str,
        'time': time.time(),
        "type": "image"
    }
    mdbs["web"].db.verify_code.insert_one(_code)
    _code.pop('_id')
    _code.pop('str')
    _code['img_url_obj'] = _code['url']
    _code['url'] = get_file_url(code_url_info, save_dir=local_dirname)
    return _code