Esempio n. 1
0
    def __rm_data_item(self, user_id, user_ref_id, default_pan_id, item_id):
        if not default_pan_id:
            pan_acc = auth_service.default_pan_account(user_id)
            if pan_acc:
                default_pan_id = pan_acc.id
        if not default_pan_id:
            return {"state": -2, "err": LOGIC_ERR_TXT['need_pann_acc']}

        _client_data_item: ClientDataItem = ClientDataDao.get_data_item_by_id(
            item_id, user_ref_id)
        if _client_data_item:
            pan_acc: PanAccounts = auth_service.get_pan_account(
                default_pan_id, user_id)
            if not pan_acc:
                logger.error("PanAccount not exists![{}],user_id:{}".format(
                    default_pan_id, user_id))
                return {"state": -2, "err": LOGIC_ERR_TXT['need_pann_acc']}
            jsonrs = restapi.del_file(pan_acc.access_token,
                                      _client_data_item.path)
            if "errno" in jsonrs and jsonrs["errno"]:
                errmsg = jsonrs.get("errmsg", "")
                if not errmsg:
                    errmsg = "clear failed!"
                return {"state": -1, "errmsg": errmsg}
            else:
                ClientDataDao.del_data_item_by_id(_client_data_item.id)
                return {"state": 0}
        else:
            return {"state": -3, "err": LOGIC_ERR_TXT['not_exists']}
Esempio n. 2
0
    def __clear_data_item(self, item_id):
        # out_pan_acc: PanAccounts = DataDao.pan_account_by_id(pan_id)
        _es_dao_item = self.es_dao_item

        def deep_clear(di, pan_acc):
            if di:
                if di.isdir == 1:
                    # 迭代处理
                    size = 50
                    l = size
                    while l == size:
                        sub_items = DataDao.query_data_item_by_parent_all(di.id, limit=size)
                        l = 0
                        if sub_items:
                            l = len(sub_items)
                            for sub_item in sub_items:
                                deep_clear(sub_item, pan_acc)
                        time.sleep(0.2)
                else:
                    fs_id = di.fs_id
                    share_log: ShareLogs = DataDao.query_shared_log_by_fs_id(fs_id)
                    if share_log:
                        self.clear_share_log(share_log.id)
                    transfer_logs = DataDao.query_transfer_logs_by_fs_id(fs_id)
                    if transfer_logs:
                        for tl in transfer_logs:
                            CommunityDao.del_transfer_log_by_id(tl.id)
                log.info("deep clear delete data item:{}, filename:{}".format(di.id, di.filename))
                _es_dao_item.delete(di.id)
                DataDao.del_data_item_by_id(di.id)

        root_di: DataItem = DataDao.get_data_item_by_id(item_id)
        if root_di:
            pan_acc: PanAccounts = auth_service.get_pan_account(root_di.panacc, root_di.account_id)
            deep_clear(root_di, pan_acc)
            if root_di.parent:
                p_data_item = DataDao.get_data_item_by_fs_id(root_di.parent)
                if p_data_item:
                    mpan_service.update_dir_size(p_data_item)
            jsonrs = restapi.del_file(pan_acc.access_token, root_di.path)
            if "errno" in jsonrs and jsonrs["errno"]:
                errmsg = jsonrs.get("errmsg", "")
                if not errmsg:
                    errmsg = "clear failed!"
                return {"state": -1, "errmsg": errmsg}
            else:
                return {"state": 0}
        else:
            log.info("deep clear , can not find root item:{}".format(item_id))
            return {"state": -1, "errmsg": "[{}] not exists.".format(item_id)}
Esempio n. 3
0
 def rename(self, item_id, old_name, alias_name, source):
     result = {'state': 0}
     if "local" == source:
         data_item: DataItem = DataDao.get_data_item_by_id(item_id)
         # print("rename data_item:", DataItem.to_dict(data_item))
         # print("old_name:", old_name)
         # print("alias_name:", alias_name)
         if data_item.filename != old_name or data_item.aliasname != alias_name:
             params = {"filename": old_name, "aliasname": alias_name}
             fs_id = int(data_item.fs_id)  # 重要, 网盘服务中类型为Int,本地为了兼容所有类型id使用了varchar
             pan_acc: PanAccounts = auth_service.get_pan_account(data_item.panacc, data_item.account_id)
             file_info_json = restapi.sync_file(pan_acc.access_token, [fs_id], False)
             if file_info_json:
                 find_item = False
                 for sync_item in file_info_json:
                     if sync_item['fs_id'] == fs_id:
                         find_item = True
                         origin_filename = sync_item['filename']
                         if origin_filename != old_name:
                             origin_path = sync_item['path']
                             _jsonrs = restapi.file_rename(pan_acc.access_token, origin_path, old_name)
                             err_no = _jsonrs.get("errno", None)
                             if 'info' in _jsonrs and not err_no:
                                 info_list = _jsonrs['info']
                                 # print("rename info_list:", info_list)
                                 if origin_path != data_item.path:
                                     params["path"] = origin_path
                                 DataDao.update_data_item(data_item.id, params)
                             else:
                                 err_msg = _jsonrs.get("errmsg", "")
                                 result['state'] = -1
                                 result['err'] = err_msg
                                 return result
                         else:
                             DataDao.update_data_item(data_item.id, params)
                 if not find_item:
                     result['state'] = -2
                     result['errmsg'] = "not find file in NetDisk,[{}]".format(data_item.filename)
                     return result
             else:
                 result['state'] = -2
                 result['err'] = "not find file in NetDisk,[{}]".format(data_item.filename)
                 return result
         return result
Esempio n. 4
0
    def checkout_root_item(self, user_id, user_ref_id, default_pan_id):
        root_item: ClientDataItem = ClientDataDao.get_root_item_by_pan_id(
            default_pan_id)
        if not root_item:
            root_item = ClientDataDao.new_root_item(user_ref_id,
                                                    default_pan_id)
        if root_item:
            top_dir_item = ClientDataDao.get_top_dir_item_by_pan_id(
                default_pan_id, PAN_ROOT_DIR['name'])
            if not top_dir_item:
                pan_acc: PanAccounts = auth_service.get_pan_account(
                    default_pan_id, user_id)
                pan_acc = auth_service.check_pan_token_validation(pan_acc)
                jsonrs = restapi.pan_mkdir(pan_acc.access_token,
                                           "/%s" % PAN_ROOT_DIR['name'])

                if 'fs_id' in jsonrs:
                    fs_id = jsonrs['fs_id']
                    ctime = jsonrs['ctime']
                    top_dir_item = ClientDataDao.new_top_dir_item(
                        user_ref_id, default_pan_id, fs_id, ctime,
                        PAN_ROOT_DIR['name'])
                elif 'category' in jsonrs and 'errno' in jsonrs:
                    jsonrs = restapi.file_search(pan_acc.access_token,
                                                 key=PAN_ROOT_DIR['name'],
                                                 parent_dir="/")
                    if jsonrs:
                        for finfo in jsonrs:
                            if finfo["server_filename"] == PAN_ROOT_DIR[
                                    'name']:
                                top_dir_item = ClientDataDao.new_top_dir_item(
                                    user_ref_id, default_pan_id,
                                    finfo["fs_id"], finfo["server_ctime"],
                                    PAN_ROOT_DIR['name'])
                                return top_dir_item
                    return None
                else:
                    return None
            return top_dir_item
        return None
Esempio n. 5
0
    def checkout_dlink(self, item_id, user_id, user_ref_id):
        _client_data_item: ClientDataItem = ClientDataDao.get_data_item_by_id(
            item_id, user_ref_id)
        need_sync = False
        if not _client_data_item.dlink_updated_at or not _client_data_item.dlink:
            need_sync = True
        elif _client_data_item.dlink_updated_at:
            dt = arrow.get(_client_data_item.dlink_updated_at).replace(
                tzinfo=self.default_tz)
            if dt.shift(hours=+DLINK_TIMEOUT) < arrow.now():
                need_sync = True
        need_thumbs = False
        if is_image_media(_client_data_item.filename
                          ) and _client_data_item.category == 3:
            need_thumbs = True

        if need_sync:
            pan_id = _client_data_item.panacc
            pan_acc: PanAccounts = auth_service.get_pan_account(
                pan_id, user_id)
            # sync_list = restapi.sync_file(self.pan_acc.access_token, [int(data_item.fs_id)])
            sync_dlink, thumbs = restapi.get_dlink_by_sync_file(
                pan_acc.access_token, int(_client_data_item.fs_id),
                need_thumbs)
            if sync_dlink:
                _client_data_item.dlink = "{}&access_token={}".format(
                    sync_dlink, pan_acc.access_token)
                _client_data_item.dlink_updated_at = get_now_datetime()
                data_item_params = {
                    "dlink": _client_data_item.dlink,
                    "dlink_updated_at": _client_data_item.dlink_updated_at
                }
                if need_thumbs:
                    if "url2" in thumbs:
                        data_item_params["thumb"] = thumbs["url2"]
                        _client_data_item.thumb = data_item_params["thumb"]
                    elif "url1" in thumbs:
                        data_item_params["thumb"] = thumbs["url1"]
                        _client_data_item.thumb = data_item_params["thumb"]
                    elif "icon" in thumbs:
                        data_item_params["thumb"] = thumbs["icon"]
                        _client_data_item.thumb = data_item_params["thumb"]
                ClientDataDao.update_client_item(_client_data_item.id,
                                                 data_item_params)
        expired_at = arrow.get(_client_data_item.dlink_updated_at).replace(
            tzinfo=self.default_tz).shift(hours=+DLINK_TIMEOUT).datetime
        loader = {
            'id': 0,
            'created_at': _client_data_item.created_at,
            'updated_at': _client_data_item.updated_at,
            'fs_id': _client_data_item.fs_id,
            'md5_val': _client_data_item.md5_val,
            'path': _client_data_item.path,
            'size': _client_data_item.size,
            'category': _client_data_item.category,
            'pin': _client_data_item.pin,
            'dlink': _client_data_item.dlink,
            'filename': _client_data_item.filename,
            'expired_at': expired_at
        }
        return [loader]
Esempio n. 6
0
 def to_do(key, rs_key):
     _result = {'state': 0}
     data_item: DataItem = DataDao.get_data_item_by_id(item_id)
     _client_data_item: ClientDataItem = ClientDataDao.get_data_item_by_source_fs_id(
         data_item.fs_id, user_ref_id)
     if _client_data_item:
         if _client_data_item.pin == 0:
             pan_acc: PanAccounts = auth_service.get_pan_account(
                 default_pan_id, user_id)
             pan_acc = auth_service.check_pan_token_validation(pan_acc)
             # 文件已迁出,等待迁入, 目录结构已存在
             async_service.update_state(key_prefix, user_id, {
                 "state": 0,
                 "pos": 2
             })
             old_name = _client_data_item.filename
             ftype = guess_file_type(old_name)
             if not ftype:
                 idx = old_name.rfind('.')
                 if idx > 0:
                     ftype = old_name[idx + 1:]
             new_name = "%s.%s" % (_client_data_item.source_fs_id,
                                   ftype)
             parent_dir = "/%s" % PAN_ROOT_DIR['name']
             new_path = "%s/%s" % (parent_dir, new_name)
             _jsonrs = restapi.file_rename(pan_acc.access_token,
                                           _client_data_item.path,
                                           new_name)
             # jsonrs = restapi.file_search(pan_acc.access_token, key=fs_id, parent_dir=parent_dir)
             # print("search new file jsonrs:", jsonrs)
             if "errno" in _jsonrs and _jsonrs["errno"] == 0:
                 _client_data_item.path = new_path
                 _client_data_item.filename = new_name
                 _client_data_item.pin = 1
                 ClientDataDao.update_client_item(
                     _client_data_item.id, {
                         "path": new_path,
                         "filename": new_name,
                         "pin": 1
                     })
                 _result['state'] = 0
                 _result['item'] = ctx.__build_client_item_simple_dict(
                     _client_data_item)
                 _result['item']['id'] = obfuscate_id(
                     _client_data_item.id)
                 _result['pos'] = 4
             else:
                 _result['state'] = -4
                 _result["err"] = LOGIC_ERR_TXT['rename_fail']
         else:
             _result['state'] = 0
             _result['item'] = ctx.__build_client_item_simple_dict(
                 _client_data_item)
             _result['item']['id'] = obfuscate_id(_client_data_item.id)
             _result['pos'] = 4
     else:
         _rs, share_log = open_service.build_shared_log(data_item)
         if not share_log:
             if 'state' in _rs:
                 _result['state'] = _rs['state']
             if 'err' in _rs:
                 _result['state'] = -9
                 _result['err'] = _rs['err']
         else:
             # copy
             if share_log.is_black == 1:
                 _result['state'] = -9
                 _result['err'] = share_log.err
             else:
                 _st, _client_data_item = self.copy_to_my_pan(
                     user_id, user_ref_id, share_log, default_pan_id)
                 _result['state'] = _st
                 if _st < 0:
                     if _st == -3:
                         _result['err'] = LOGIC_ERR_TXT['mk_top_fail']
                     elif _st == -4:
                         _result['err'] = LOGIC_ERR_TXT['rename_fail']
                 if _client_data_item:
                     _result[
                         'item'] = ctx.__build_client_item_simple_dict(
                             _client_data_item)
                     _result['item']['id'] = obfuscate_id(
                         _client_data_item.id)
                     _result['pos'] = 4
     return _result
Esempio n. 7
0
    def copy_to_my_pan(self, user_id, user_ref_id, share_log: ShareLogs,
                       default_pan_id):
        fs_id = share_log.fs_id
        key_prefix = "client:ready:"
        # 文件已迁出,等待迁入
        async_service.update_state(key_prefix, user_id, {"state": 0, "pos": 1})
        top_dir_item = self.checkout_root_item(user_id, user_ref_id,
                                               default_pan_id)
        if not top_dir_item:
            return -3, None  # 无法创建顶级目录
        pan_acc: PanAccounts = auth_service.get_pan_account(
            default_pan_id, user_id)
        if not pan_acc:
            logger.error("PanAccount not exists![{}],user_id:{}".format(
                default_pan_id, user_id))
            return -3, None
        pan_acc = auth_service.check_pan_token_validation(pan_acc)
        # 目录结构构建
        async_service.update_state(key_prefix, user_id, {"state": 0, "pos": 2})

        find_pan_file = False
        client_item_params = {}
        jsonrs = restapi.file_search(pan_acc.access_token,
                                     key=fs_id,
                                     parent_dir=top_dir_item.path)
        if jsonrs:
            for finfo in jsonrs:
                if "fs_id" in finfo:
                    md5_val = finfo["md5"]
                    if md5_val == share_log.md5_val:
                        find_pan_file = True
                        client_item_params = self.build_client_item_params(
                            finfo, top_dir_item.id, user_ref_id, pan_acc.id,
                            fs_id)
                        break
        if find_pan_file:
            client_data_item = ClientDataDao.new_data_item(client_item_params)
            return 0, client_data_item
        # print("target pan acc id:", pan_acc.id)

        jsonrs = restapi.transfer_share_files(pan_acc.access_token,
                                              share_id=share_log.share_id,
                                              from_uk=share_log.uk,
                                              randsk=share_log.randsk,
                                              fs_id=share_log.fs_id,
                                              path=top_dir_item.path)
        if "extra" in jsonrs and "list" in jsonrs["extra"]:
            file_path = jsonrs["extra"]["list"][0]["to"]
            key = self.parse_query_key(file_path)
            # 迁出后, 获取信息
            async_service.update_state(key_prefix, user_id, {
                "state": 0,
                "pos": 3
            })
            time.sleep(3)
            client_data_item = self.check_file_by_key_search(
                key, top_dir_item.path, top_dir_item.id, share_log.md5_val,
                fs_id, user_ref_id, pan_acc)
            if client_data_item:
                return 0, client_data_item
            return -4, None  # 无法转存文件
        elif jsonrs.get('errno', 0) == -30 and 'path' in jsonrs:
            logger.info("exists jsonrs:{}".format(jsonrs))
            file_path = jsonrs.get('path', None)
            if file_path:
                # 迁出后, 获取信息
                async_service.update_state(key_prefix, user_id, {
                    "state": 0,
                    "pos": 3
                })
                key = self.parse_query_key(file_path)
                client_data_item = self.check_file_by_key_search(
                    key, top_dir_item.path, top_dir_item.id, share_log.md5_val,
                    fs_id, user_ref_id, pan_acc)
                if client_data_item:
                    return 0, client_data_item
            return -4, None  # 无法转存文件
        elif "errno" in jsonrs:
            return -4, None  # 无法转存文件