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
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
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
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
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
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
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
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
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
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
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("."))
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
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
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
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
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
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
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
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
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
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
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