Example #1
0
    def _delete(self, msg):
        string = msg.content
        try:
            argv = string.split()
            article_id = int(argv[1])
        except:
            logger.info("_delete parse string fail: " + string)
            return "delete 失败,不是合法的输入,请检查格式"

        db = DbOperator()
        success, result = db.find_article(article_id)
        if not success:
            logger.debug("_delete fetch nothing: " + string)
            return "试图删除编号为" + str(article_id) + "的文章,但未找到"
        user = msg.source
        if result['open_id'] == user:  # 确实是本人的观察目标
            if update_article_status(article_id,
                                     False,
                                     optionals={
                                         "reason": REASON_DELETE_BY_USER
                                     }):
                return "成功删除观察目标:" + str(article_id)
            else:
                logger.error("_delete process fail: " + string)
                return "您的输入合法,但后台处理失败,请联系管理员"
        else:
            logger.info(user + " try to delete article: " + str(article_id))
            return str(article_id) + " 不是您的观察目标,无法删除"
Example #2
0
def update_article_status(article_id, valid, backup_path=None):
    # 做点准备工作
    db = DbOperator()
    success, item = db.find_article(article_id)
    if not success:
        # log it
        print("can't find article by article_id: " + str(article_id))
        logger.error("can't find article by article_id: " + str(article_id))
        return False
    URL = item['URL']
    open_id = item['open_id']
    success, result = db.find_user(open_id)
    if not success:
        logger.error("article & user no match: " +
                     " ".join(map(str, [article_id, open_id])))
        return False
    email = result['email']

    if not valid:  # 当文章已不可访问
        if item['backup_addr'] == FAKE_PATH_PLACE_HOLDER:
            backup_addr = None
        else:
            backup_addr = item['backup_addr']
        notify_user(email, URL, backup_addr)
        db.archive_article(item)
        logger.info("article expired, move to archive: " +
                    " ".join(map(str, [article_id, URL])))
    else:
        prev_status = item['status']
        if prev_status == 1:  # 正常观察状态,无需额外操作
            return True
        elif prev_status == 0:  # 初次完成观察,制作备份
            if backup_path == None:
                print("backup addr not valid")
                return False
            else:
                new_path = _backup_article(article_id, backup_path)
                if new_path == None:
                    return False
                article_info = (article_id, new_path, 1)  # 制作备份完成,状态更新成1
                return db.update_article(article_info)
        else:
            print("unknown status!")
            logger.error(
                "article status Error: " +
                " ".join(map(str, [article_id, open_id, prev_status])))

    return True
Example #3
0
def update_article_status(article_id, valid, backup_path=None, optionals={}):
    """Do jobs when article status changed.

    Args:
        article_id : int
        valid : bool
        backup_path : str
        optionals : dict 
            maybe contains: "reason" shows why status changed
                            "title" shows article title detected
    Returns:
        success: bool
    """
    # 做点准备工作
    db = DbOperator()
    success, item = db.find_article(article_id)
    if not success:
        # log it
        print("can't find article by article_id: " + str(article_id))
        logger.error("can't find article by article_id: " + str(article_id))
        return False
    open_id = item['open_id']
    success, result = db.find_user(open_id)
    if success:
        email = result['email']
        user_registered_flag = True
    else:
        logger.info("article & user no match: "
                     + " ".join(map(str, [article_id, open_id])))
        user_registered_flag = False

    # 根据状态变化执行处理
    if not valid:  # 当文章已不可访问
        if user_registered_flag: # 用户有绑定邮箱,则执行通知
            update_info = (article_id, optionals)
            _stop_watching(update_info, item, email, db)
        else: # 没有绑定邮箱,记错误日志
            logger.error("article invalid, can't notify user. "
                        + " ".join(map(str, [article_id, open_id])))
    else:
        prev_status = item['status']
        if prev_status == STATUS_NORMAL_OB:  # 正常观察状态,无需额外操作
            return True
        elif prev_status == STATUS_NEW_UNKNOWN:  # 初次完成观察,制作备份
            if backup_path is None:
                print("backup addr not valid")
                return False
            else:
                new_path = _backup_article(article_id, backup_path)
                try:
                    title = optionals["title"]
                except KeyError:
                    title = ''
                if new_path is None:
                    return False
                article_info = (article_id, new_path, STATUS_NORMAL_OB, title) # 制作备份完成,状态更新
                return db.update_article(article_info)
        else:
            print("unknown status!")
            logger.error("article status Error: "
                         + " ".join(map(str, [article_id, open_id, prev_status])))

    return True
Example #4
0
def update_article_status(article_id, valid, backup_path=None, optionals={}):
    """Do jobs when article status changed.

    Args:
        article_id : int
        valid : bool
        backup_path : str
        optionals : dict 
            maybe contains: "reason" shows why status changed
                            "title" shows article title detected
    Returns:
        success: bool
    """
    # 做点准备工作
    db = DbOperator()
    success, item = db.find_article(article_id)
    if not success:
        # log it
        print("can't find article by article_id: " + str(article_id))
        logger.error("can't find article by article_id: " + str(article_id))
        return False
    URL = item['URL']
    open_id = item['open_id']
    success, result = db.find_user(open_id)
    if not success:
        logger.error("article & user no match: "
                     + " ".join(map(str, [article_id, open_id])))
        return False
    email = result['email']
    # 开始更新数据库
    if not valid:  # 当文章已不可访问
        if item['backup_addr'] == FAKE_PATH_PLACE_HOLDER:
            backup_addr = None
        else:
            backup_addr = item['backup_addr']
        try:
            notify_user(email, URL, backup_addr)
            item['status'] = reason2status[optionals["reason"]]
            db.archive_article(item)
        except:
            logger.error("update_article_status ERROR")
            return False
        logger.info("article expired, move to archive: "
                    + " ".join(map(str, [article_id, URL])))
    else:
        prev_status = item['status']
        if prev_status == STATUS_NORMAL_OB:  # 正常观察状态,无需额外操作
            return True
        elif prev_status == STATUS_NEW_UNKNOWN:  # 初次完成观察,制作备份
            if backup_path == None:
                print("backup addr not valid")
                return False
            else:
                new_path = _backup_article(article_id, backup_path)
                if new_path == None:
                    return False
                article_info = (article_id, new_path, STATUS_NORMAL_OB) # 制作备份完成,状态更新
                return db.update_article(article_info)
        else:
            print("unknown status!")
            logger.error("article status Error: "
                         + " ".join(map(str, [article_id, open_id, prev_status])))

    return True