Пример #1
0
def delete_sys_message():
    """
    删除已发送邮件
    :return:
    """

    ids = json_to_pyseq(request.argget.all("ids", []))
    for i, tid in enumerate(ids):
        ids[i] = ObjectId(tid)
    q = {"_id": {"$in": ids}}

    # 查找出要删除中的邮件消息
    q2 = deepcopy(q)
    q2["type"] = "email"
    msgs = mdbs["sys"].db.sys_message.find(q2)
    rm_imgs = []  # 要删除的邮件消息图片
    for msg in msgs:
        srcs = richtext_extract_img(richtext=msg["html"])
        rm_imgs.extend(srcs)

    for rm_img in rm_imgs:
        # 获取图片url中唯一部分
        key = os.path.split(rm_img)
        if len(key) > 0:
            key = key[-1]
        else:
            continue
        # 查找出图片对应的key
        img_obj = mdbs["sys"].db.sys_msg_img.find_one(
            {"imgs.key": {
                "$regex": key
            }}, regular_escape=False)
        if img_obj:
            for img in img_obj["imgs"]:
                # 删除
                file_del(img)
            mdbs["sys"].db.sys_msg_img.delete_one({"_id": img_obj["_id"]})

    r = mdbs["sys"].db.sys_message.delete_many(q)
    if r.deleted_count:
        data = {
            "msg": gettext("Successfully deleted"),
            "msg_type": "s",
            "custom_status": 204
        }
    else:
        data = {
            "msg": gettext("Failed to delete"),
            "msg_type": "w",
            "custom_status": 400
        }
    return data
Пример #2
0
def post_issue():

    tid = request.argget.all('id')
    title = request.argget.all('title', "").strip()
    content = request.argget.all('content', "")
    content_text = request.argget.all('content_text', "")
    editor = request.argget.all('editor')
    category = request.argget.all('category')
    tags = json_to_pyseq(request.argget.all('tags', []))
    issue_way = request.argget.all('issue_way', 'issue')
    cover_url = request.argget.all('cover_url')

    # 标签处理验证
    tag_max_num = get_config("post", "TAG_MAX_NUM")
    if len(tags) > tag_max_num:
        data = {
            "msg": gettext("Up to {} tags are used").format(tag_max_num),
            "msg_type": "w",
            "custom_status": 403
        }
        return data

    tags = list(set(tags))
    temp_tags = ""
    for tag in tags:
        s, r = arg_verify(reqargs=[(gettext("tag"), tag)],
                          max_len=get_config("post", "TAG_MAX_LEN"))
        if not s:
            return r
        temp_tags = "{} {}".format(tag, temp_tags)

    # 分类验证
    try:
        ObjectId(category)
    except BaseException:
        category = None
    # Title 处理
    s, r = arg_verify(reqargs=[(gettext("title"), title.strip())],
                      max_len=get_config("post", "TITLE_MAX_LEN"),
                      required=True)
    if not s:
        return r
    # content
    s, r = arg_verify(reqargs=[(gettext("content"), content.strip()),
                               ("editor", editor)],
                      required=True)
    if not s:
        return r

    text_l = len(content_text)
    if text_l > get_config("post", "BRIEF_LEN"):
        brief_content = content_text[0:get_config("post", "BRIEF_LEN")]
    else:
        brief_content = content_text
    s, r = arg_verify(reqargs=[(gettext("content"), content_text)],
                      max_len=int(get_config("post", "MAX_LEN")))
    if not s:
        data = r
    else:
        if issue_way == "issue":
            issue_way = 1
        else:
            issue_way = 0
        # 获取已上传的文章图片
        old_imgs = []
        if tid:
            # 文章更新
            post = mdbs["web"].db.post.find_one({
                "_id": ObjectId(tid),
                "user_id": current_user.str_id
            })
            if post["issue_time"]:
                # 有发布时间,则发布时间不改变
                issue_time = post["issue_time"]
            elif issue_way:
                # 第一次发布
                issue_time = time.time()
            else:
                # 不发布
                issue_time = 0

            old_imgs = post["imgs"]

        elif issue_way:
            # 发布时间
            issue_time = time.time()
        else:
            # 不发布就不需要发布时间
            issue_time = 0

        # 获取文章中使用的图片
        # 如果是markdown
        if editor == "markdown":
            srcs = richtext_extract_img(richtext=markdown.markdown(content))
        else:
            srcs = richtext_extract_img(richtext=content)
        imgs = clean_tempfile(user_id=current_user.str_id,
                              type="image",
                              old_file=old_imgs,
                              keey_file=srcs)

        if not cover_url and len(imgs) > 0:
            cover_url = imgs[0]

        if issue_way:
            r = content_inspection_text("{} {} {}".format(
                title, content, temp_tags))
            audit_score = r["score"]
            audit_label = r["label"]
            if r["label"] == "detection_off" or ("suggestion" in r and
                                                 r["suggestion"] == "review"):
                # 未开启审核或无法自动鉴别, 等待人工审核
                audited = 0
                audit_way = "artificial"

            elif r["label"] == "no_plugin":
                # 没有检查插件
                audited = 0
                audit_way = "artificial"

            else:
                audit_label = r["label"]
                audited = 1
                audit_way = "auto"
        else:
            # 草稿
            audit_label = None
            audited = audit_score = 0
            audit_way = "auto"
        content = content_attack_defense(content)["content"]
        brief_content = content_attack_defense(brief_content)["content"]
        post = {
            "title": title.strip(),
            "content": content.strip(),
            "brief_content": brief_content,
            "category": category,
            "tags": tags,
            "issued": issue_way,
            "issue_time": issue_time,
            "update_time": time.time(),
            "audited": audited,
            "audit_score": audit_score,
            "audit_user_id": None,
            "audit_way": audit_way,
            "audit_label": audit_label,
            "word_num": text_l,
            "is_delete": 0,
            "imgs": imgs,
            "cover_url": cover_url
        }

        if tid:
            mdbs["web"].db.post.update_one(
                {
                    "_id": ObjectId(tid),
                    "user_id": current_user.str_id
                }, {"$set": post},
                upsert=True)
        else:
            post["comment_num"] = 0
            post["like"] = 0
            post["like_user_id"] = []
            post["user_id"] = current_user.str_id
            post["editor"] = editor
            r = mdbs["web"].db.post.insert_one(post)
            tid = r.inserted_id

        # 如果已审核, 并且分数高于最高检查违规分, 给用户通知
        if audited and issue_way and audit_score >= get_config(
                "content_inspection", "ALLEGED_ILLEGAL_SCORE"):
            insert_user_msg(
                user_id=post["user_id"],
                ctype="notice",
                label="audit_failure",
                title=gettext("[Label:{}]Post allegedly violated").format(
                    audit_label),
                content={"text": post["brief_content"]},
                target_id=str(tid),
                target_type="post")
        if issue_way:
            data = {
                "msg": gettext("Issue success"),
                "msg_type": "s",
                "custom_status": 201
            }
        else:
            data = {
                "msg": gettext("Save success"),
                "msg_type": "s",
                "custom_status": 201
            }
    return data
Пример #3
0
def add_display_setting():
    """
    :return:
    """

    batch = request.argget.all("batch", False)
    name = request.argget.all("name")
    link = request.argget.all("link")
    link_open_new_tab = str_to_num(request.argget.all("link_open_new_tab", 1))
    link_name = request.argget.all("link_name")
    title = request.argget.all("title")
    text = request.argget.all("text", "")
    text_html = request.argget.all("text_html", "")
    code = request.argget.all("code", "")
    code_type = request.argget.all("code_type")
    ctype = request.argget.all("ctype")
    category_id = request.argget.all("category_id")
    data = {}
    category = "Default"

    if code_type == "json":
        code = json_to_pyseq(code)
    if category_id and category_id.lower() != "default":
        display_setting_category = mdbs["web"].db.category.find_one(
            {"_id": ObjectId(category_id)})
        if display_setting_category:
            category = display_setting_category["name"]
    elif not category_id or category_id.lower() == "default":
        category_id = ""

    s, r = arg_verify([(gettext("type"), ctype)],
                      only=get_config("category", "CATEGORY_TYPE").values())
    if not s:
        return r
    s, r = arg_verify([(gettext("name"), name)], required=True)
    if not s and not batch:
        return r

    # 如果有上传文件
    if request.files:
        data = file_upload(return_key=True,
                           prefix="multidisplay_setting/{}/".format(ctype))
        if data["msg_type"] != "s":
            return data

    theme_name = get_config("theme", "CURRENT_THEME_NAME")
    if not batch and mdbs["sys"].db.theme_display_setting.find_one(
        {
            "name": name,
            "type": ctype,
            "theme_name": theme_name
        }):
        type_alias = ctype
        for k, v in get_config("category", "CATEGORY_TYPE").items():
            if v == ctype:
                type_alias = k
                break
        data = {
            "msg":
            gettext('The type "{}" exists in the name "{}"').format(
                type_alias, name),
            "msg_type":
            "w",
            "custom_status":
            403
        }
    else:
        # 获取text_html使用的图片
        if text_html:
            srcs = richtext_extract_img(richtext=text_html)
        else:
            srcs = []
        text_imgs = clean_tempfile(user_id=current_user.str_id,
                                   type="image",
                                   keey_file=srcs)

        info = {
            "theme_name": theme_name,
            "category": category,
            "category_id": category_id,
            "link": link,
            "link_open_new_tab": link_open_new_tab,
            "link_name": link_name,
            "title": title,
            "text": text,
            "text_html": text_html,
            "code": code,
            "code_type": code_type,
            "switch": 0,
            "text_imgs": text_imgs,
            "type": ctype,
            "time": time.time()
        }
        if "keys" in data:
            for key in data["keys"]:
                rand_name = "{}_{}".format(name, uuid1())
                info["name"] = rand_name
                info["url"] = key
            mdbs["sys"].db.theme_display_setting.insert_one(info)
            data["msg"] = gettext("{} uploaded successfully").format(
                ctype.capitalize())
        else:
            info["name"] = name
            info["url"] = None
            mdbs["sys"].db.theme_display_setting.insert_one(info)
            data["msg"] = gettext("Added successfully").format(
                ctype.capitalize())
        data["msg_type"] = "s"
        data["custom_status"] = 201

    return data
Пример #4
0
def edit_display_setting():
    """
    :return:
    """
    display_setting_id = request.argget.all("id")
    name = request.argget.all("name")
    link = request.argget.all("link")
    link_name = request.argget.all("link_name")
    link_open_new_tab = str_to_num(request.argget.all("link_open_new_tab", 1))
    title = request.argget.all("title")
    text = request.argget.all("text", "")
    text_html = request.argget.all("text_html", "")
    code = request.argget.all("code", "")
    code_type = request.argget.all("code_type")
    switch = request.argget.all("switch")
    category_id = request.argget.all("category_id")
    s, r = arg_verify([("id", display_setting_id)], required=True)
    if not s:
        return r

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

    if code_type == "json":
        code = json_to_pyseq(code)

    theme_name = get_config("theme", "CURRENT_THEME_NAME")
    old_display_setting = mdbs["sys"].db.theme_display_setting.find_one({
        "_id":
        ObjectId(display_setting_id),
        "theme_name":
        theme_name
    })

    # 如果只是更新图片, 则保存上传图片
    if request.files:
        data = file_upload(return_key=True,
                           prefix="multidisplay_setting/{}/".format(
                               old_display_setting["type"]))
        if data["msg_type"] != "s":
            return data
        else:
            # 删除旧的图片
            if "url" in old_display_setting:
                file_del(old_display_setting["url"])
            temp_url = None
            if "keys" in data:
                for key in data["keys"]:
                    temp_url = key
                if temp_url:
                    mdbs["sys"].db.theme_display_setting.update_one(
                        {
                            "_id": ObjectId(display_setting_id),
                            "theme_name": theme_name
                        }, {"$set": {
                            "url": temp_url
                        }})
                    data = {
                        "msg": gettext("Update picture successfully"),
                        "msg_type": "s",
                        "custom_status": 201
                    }
                else:
                    data = {
                        "msg": gettext("Failed to update"),
                        "msg_type": "e",
                        "custom_status": 400
                    }
            return data

    category = "Default"
    not_updated_category = False
    if category_id is None:
        # 不更新category
        not_updated_category = True
    elif category_id and category_id.lower() != "default":
        display_setting_category = mdbs["web"].db.category.find_one(
            {"_id": ObjectId(category_id)})
        if display_setting_category:
            category = display_setting_category["name"]

    elif category_id.lower() == "default":
        category_id = ""

    # 处理其他字段更新
    query = {
        "name": name,
        "type": old_display_setting["type"],
        "_id": {
            "$ne": ObjectId(display_setting_id)
        },
        "theme_name": theme_name
    }
    if mdbs["sys"].db.theme_display_setting.find_one(query):
        type_alias = old_display_setting["type"]

        for k, v in get_config("category", "CATEGORY_TYPE").items():
            if v == old_display_setting["type"]:
                type_alias = k
                break
        data = {
            "msg":
            gettext('The type "{}" exists in the name "{}"').format(
                type_alias, name),
            "msg_type":
            "w",
            "custom_status":
            403
        }
    else:
        # 获取text_html使用的图片
        old_imgs = old_display_setting.get("text_imgs", [])
        if text_html:
            srcs = richtext_extract_img(richtext=text_html)
        else:
            srcs = []

        text_imgs = clean_tempfile(user_id=current_user.str_id,
                                   type="image",
                                   old_file=old_imgs,
                                   keey_file=srcs)
        info = {
            "name": name,
            "link": link,
            "link_name": link_name,
            "link_open_new_tab": link_open_new_tab,
            "title": title,
            "text": text,
            "text_html": text_html,
            "code": code,
            "code_type": code_type,
            "text_imgs": text_imgs,
        }
        if switch is not None and switch.isdigit():
            info["switch"] = int(switch)
        if not not_updated_category:
            info["category_id"] = category_id
            info["category"] = category

        r = mdbs["sys"].db.theme_display_setting.update_one(
            {
                "_id": ObjectId(display_setting_id),
                "theme_name": theme_name
            }, {"$set": info})
        if r.modified_count:
            data = {
                "msg": gettext("Modify the success"),
                "msg_type": "s",
                "custom_status": 201
            }
        else:
            data = {
                "msg": gettext("The content is not modified"),
                "msg_type": "w",
                "custom_status": 400
            }

    return data
Пример #5
0
def send_msg():

    '''
    发送消息
    :return:
    '''

    title = request.argget.all("title")
    content = request.argget.all("content")
    content_html = request.argget.all("content_html")
    send_type = json_to_pyseq(request.argget.all("send_type",[]))
    username = json_to_pyseq(request.argget.all("username", []))

    s, r = arg_verify([(gettext(gettext("title")), title),
                       (gettext("content"), content_html),
                       (gettext("send type"), send_type),
                       (gettext("user name"), username)],
                      required=True)
    if not s:
        return r

    data = {"msg":"", "msg_type":"s"}
    query = {"is_delete": {"$in": [False, 0, ""]}, "active": {"$in": [True, 1]}}
    if len(username) > 1 or username[0].lower() != "all":
        # 不是发给全部用户
        query["username"] = {"$in": username}

    users = list(mdb_user.db.user.find(query, {"_id": 1, "email": 1, "mphone_num":1}))

    # 清理消息中的临时img
    if "email" not in send_type:
        # 删除所有上传的图片
        srcs = []
    else:
        # 保留邮件内容中使用的图片
        srcs = richtext_extract_img(richtext=content_html)
    imgs = clean_tempfile(user_id=current_user.str_id,
                          type="image", old_file=[],
                          keey_file=srcs)
    if imgs:
        # 保存邮件中上传的图片记录, 以便之后删除
        mdb_sys.db.sys_msg_img.insert({"time":time.time(), "imgs":imgs,
                                         "send_user_id":current_user.str_id,
                                         "title":title})
    for send_t in send_type:
        if send_t == "on_site":
            for user in users:
                insert_user_msg(user_id=user["_id"], ctype="notice", label="sys_notice",
                                title=title, content={"text":content}, is_sys_msg=True)

            if users:
                data["msg"] = "{}. {}".format(data["msg"], gettext("Station news success"))
            else:
                data["msg"] = "{}. {}".format(data["msg"], gettext("No relevant user"))
                data["msg_type"] = "w"

        elif send_t == "email":
            to_emails = []
            for user in users:
                to_emails.append(user["email"])
            if to_emails:
                send_email(subject=title,
                           recipients=to_emails,
                           html_msg=content_html)
                data["msg"] = "{}. {}".format(data["msg"], gettext("Mail message is being sent"))
            else:
                data["msg"] = "{}. {}".format(data["msg"], gettext("There is no such email address user"))
                data["msg_type"] = "w"

        elif send_t == "sms":
            # 发送短信
            to_mnumber = []
            for user in users:
                if "mphone_num" in user:
                    to_mnumber.append(user["mphone_num"])

            if to_mnumber:
                send_mobile_msg(to_mnumber, content)

                data["msg"] = "{}. {}".format(data["msg"], gettext("SMS sent"))
            else:
                data["msg"] = "{}. {}".format(data["msg"], gettext("No user mobile phone number was obtained"))
                data["msg_type"] = "w"

    data["msg"]= data["msg"].strip(". ")
    data["http_status"] = 201
    return data
Пример #6
0
def add_media(user_id=None):
    """
    :param user_id: 媒体为管理端(系统)所有时需要传入user_id = 0
    :return:
    """

    if user_id is None:
        user_id = current_user.str_id
    batch = request.argget.all("batch", False)
    name = request.argget.all("name")
    link = request.argget.all("link")
    link_open_new_tab = str_to_num(request.argget.all("link_open_new_tab", 1))
    link_name = request.argget.all("link_name")
    title = request.argget.all("title")
    text = request.argget.all("text", "")
    text_html = request.argget.all("text_html", "")
    ctype = request.argget.all("ctype")
    category_id = request.argget.all("category_id")
    data = {}
    category = "Default"

    if category_id and category_id.lower() != "default":
        media_category = mdb_web.db.category.find_one(
            {"_id": ObjectId(category_id)})
        if media_category:
            category = media_category["name"]
    elif not category_id or category_id.lower() == "default":
        category_id = ""

    s, r = arg_verify([(gettext("type"), ctype)],
                      only=get_config("category", "CATEGORY_TYPE").values())
    if not s:
        return r
    s, r = arg_verify([(gettext("name"), name)], required=True)
    if not s and not batch:
        return r

    # 如果有上传文件
    if request.files:
        data = file_upload(return_key=True,
                           prefix="multimedia/{}/".format(ctype))
        if data["msg_type"] != "s":
            return data

    if not batch and mdb_web.db.media.find_one({"name": name, "type": ctype}):
        type_alias = ctype
        for k, v in get_config("category", "CATEGORY_TYPE").items():
            if v == ctype:
                type_alias = k
                break
        data = {
            "msg":
            gettext('The type "{}" exists in the name "{}"').format(
                type_alias, name),
            "msg_type":
            "w",
            "http_status":
            403
        }
    else:
        # 获取text_html使用的图片
        text_imgs = []
        if text_html:
            srcs = richtext_extract_img(richtext=text_html)
        else:
            srcs = []
        text_imgs = clean_tempfile(user_id=current_user.str_id,
                                   type="image",
                                   keey_file=srcs)

        info = {
            "category": category,
            "category_id": category_id,
            "link": link,
            "link_open_new_tab": link_open_new_tab,
            "link_name": link_name,
            "title": title,
            "text": text,
            "text_html": text_html,
            "text_imgs": text_imgs,
            "type": ctype,
            "time": time.time(),
            "user_id": user_id
        }
        if "keys" in data:
            for key in data["keys"]:
                rand_name = "{}_{}".format(name, uuid1())
                info["name"] = rand_name
                info["url"] = key
            mdb_web.db.media.insert_one(info)
            data["msg"] = gettext("{} uploaded successfully").format(
                ctype.capitalize())
        else:
            info["name"] = name
            info["url"] = None
            mdb_web.db.media.insert_one(info)
            data["msg"] = gettext("Added successfully").format(
                ctype.capitalize())
        data["msg_type"] = "s"
        data["http_status"] = 201

    return data
Пример #7
0
def edit_media(user_id=None):
    """
    :param user_id: 媒体为管理端(系统)所有时需要传入user_id = 0
    :return:
    """

    if user_id is None:
        user_id = current_user.str_id
    media_id = request.argget.all("id")
    name = request.argget.all("name")
    link = request.argget.all("link")
    link_name = request.argget.all("link_name")
    link_open_new_tab = str_to_num(request.argget.all("link_open_new_tab", 1))
    title = request.argget.all("title")
    text = request.argget.all("text", "")
    text_html = request.argget.all("text_html", "")
    category_id = request.argget.all("category_id")
    s, r = arg_verify([("id", media_id)], required=True)
    if not s:
        return r

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

    old_media = mdb_web.db.media.find_one({"_id": ObjectId(media_id)})

    # 如果只是更新图片, 则保存上传图片
    if request.files:
        data = file_upload(return_key=True,
                           prefix="multimedia/{}/".format(old_media["type"]))
        if data["msg_type"] != "s":
            return data
        else:
            # 删除旧的图片
            file_del(old_media["url"])
            temp_url = None
            if "keys" in data:
                for key in data["keys"]:
                    temp_url = key
                if temp_url:
                    mdb_web.db.media.update_one(
                        {
                            "_id": ObjectId(media_id),
                            "user_id": user_id
                        }, {"$set": {
                            "url": temp_url
                        }})
                    data = {
                        "msg": gettext("Update picture successfully"),
                        "msg_type": "s",
                        "http_status": 201
                    }
                else:
                    data = {
                        "msg": gettext("Failed to update"),
                        "msg_type": "e",
                        "http_status": 400
                    }
            return data

    category = "Default"
    not_updated_category = False
    if category_id is None:
        # 不更新category
        not_updated_category = True
    elif category_id and category_id.lower() != "default":
        media_category = mdb_web.db.category.find_one(
            {"_id": ObjectId(category_id)})
        if media_category:
            category = media_category["name"]

    elif category_id.lower() == "default":
        category_id = ""

    # 处理其他字段更新
    query = {
        "name": name,
        "type": old_media["type"],
        "_id": {
            "$ne": ObjectId(media_id)
        }
    }
    if mdb_web.db.media.find_one(query):
        type_alias = old_media["type"]

        for k, v in get_config("category", "CATEGORY_TYPE").items():
            if v == old_media["type"]:
                type_alias = k
                break
        data = {
            "msg":
            gettext('The type "{}" exists in the name "{}"').format(
                type_alias, name),
            "msg_type":
            "w",
            "http_status":
            403
        }
    else:
        # 获取text_html使用的图片
        old_imgs = old_media.get("text_imgs", [])
        if text_html:
            srcs = richtext_extract_img(richtext=text_html)
        else:
            srcs = []

        text_imgs = clean_tempfile(user_id=current_user.str_id,
                                   type="image",
                                   old_file=old_imgs,
                                   keey_file=srcs)
        info = {
            "name": name,
            "link": link,
            "link_name": link_name,
            "link_open_new_tab": link_open_new_tab,
            "title": title,
            "text": text,
            "text_html": text_html,
            "text_imgs": text_imgs
        }

        if not not_updated_category:
            info["category_id"] = category_id
            info["category"] = category

        r = mdb_web.db.media.update_one(
            {
                "_id": ObjectId(media_id),
                "user_id": user_id
            }, {"$set": info})
        if r.modified_count:
            data = {
                "msg": gettext("Modify the success"),
                "msg_type": "s",
                "http_status": 201
            }
        else:
            data = {
                "msg": gettext("The content is not modified"),
                "msg_type": "w",
                "http_status": 400
            }

    return data