def query_assets_by_ref_id_for_tree(cls, ref_id, pin=None, offset=0, limit=500): assets_list = cls.query_assets_by_ref_id(ref_id, pin, offset, limit) params = [] assets: Assets = None for assets in assets_list: data_id = decrypt_id(assets.pro_no) has_children = False if assets.isdir == 1: icon_val = "folder" has_children = True else: f_type = guess_file_type(assets.desc) if f_type: icon_val = "jstree-file file-%s" % f_type item = { "id": obfuscate_id(data_id), "text": assets.desc, "data": { "path": "#", "server_ctime": 0, "isdir": assets.isdir, "tag": "asset", "_id": obfuscate_id(assets.id) }, "children": has_children, "icon": icon_val } params.append(item) return params
def check_file_by_key_search(self, key, parent_dir, parent_id, _md5_val, fs_id, user_ref_id, pan_acc: PanAccounts): jsonrs = restapi.file_search(pan_acc.access_token, key=key, parent_dir=parent_dir) for finfo in jsonrs: logger.info( "check_file_by_key_search finfo:{}, target md5:{}".format( finfo, _md5_val)) if "fs_id" in finfo: md5_val = finfo["md5"] if md5_val == _md5_val: client_item_params = self.build_client_item_params( finfo, parent_id, user_ref_id, pan_acc.id, fs_id) client_data_item = ClientDataDao.new_data_item( client_item_params) # rename 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" % (fs_id, ftype) logger.info("old name:{}, new_name:{}".format( old_name, new_name)) _jsonrs = restapi.file_rename(pan_acc.access_token, client_data_item.path, new_name) if 'info' in _jsonrs: info_list = _jsonrs['info'] # print("rename info_list:", info_list) new_path = "%s/%s" % (parent_dir, new_name) # jsonrs = restapi.file_search(pan_acc.access_token, key=fs_id, parent_dir=parent_dir) # print("search new file jsonrs:", jsonrs) ClientDataDao.update_client_item( client_data_item.id, { "path": new_path, "filename": new_name, "pin": 1 }) client_data_item.path = new_path client_data_item.filename = new_name client_data_item.pin = 1 return client_data_item return None
def query_client_sub_list(self, parent_id, ref_id): cdi_list = ClientDataDao.query_client_item_list_by_parent( parent_id, ref_id) params = [] if cdi_list: for item in cdi_list: item_id = item.id fuzzy_id = obfuscate_id(int(item_id)) # print("query_root_list item_id:", item_id, ",fuzzy_id:", fuzzy_id) icon_val = "file" name = item.filename if item.aliasname: name = item.aliasname isdir = item.isdir has_children = True if isdir == 1 else False if not has_children: f_type = guess_file_type(name) if f_type: icon_val = "file file-%s" % f_type format_size = scale_size(item.size) params.append({ "id": fuzzy_id, "text": name, "data": { "source": "self", "_id": fuzzy_id, "isdir": isdir, "tag": "free", "path": item.path, "category": item.category, "fs_id": item.fs_id, "format_size": format_size }, "children": has_children, "icon": icon_val }) return params
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
def query_file_list(self, parent_item_id): # item_list = CommunityDao.query_data_item_by_parent(parent_item_id, True, pan_id, limit=1000) params = [] sp: SearchParams = SearchParams.build_params(0, 1000) # sp.add_must(is_match=False, field="path", value=parent_path) sp.add_must(is_match=False, field="parent", value=parent_item_id) # sp.add_must(is_match=False, field="isdir", value=0) # if pan_id and pan_id > 0: # sp.add_must(is_match=False, field="sourceid", value=pan_id) es_body = build_query_item_es_body(sp) print("local es_body:", es_body) es_result = es_dao_local().es_search_exec(es_body) hits_rs = es_result["hits"] total = hits_rs["total"] print("local files es total:", total) for _s in hits_rs["hits"]: icon_val = "jstree-file" ori_fn_name = _s["_source"]["filename"] ori_aliasname = '' if "aliasname" in _s["_source"] and _s["_source"]["aliasname"]: ori_aliasname = _s["_source"]["aliasname"] aliasname = ori_aliasname fn_name = ori_fn_name txt = fn_name if aliasname: fn_name, extname = split_filename(fn_name) alias_fn, alias_extname = split_filename(aliasname) if not alias_extname: alias_extname = extname aliasname = "{}{}".format( alias_fn, "." + alias_extname if alias_extname.strip() else "") txt = "[{}]{}".format(fn_name, aliasname) is_dir = _s["_source"]["isdir"] == 1 t_tag = ES_TAG_MAP['FREE'] is_free = False tags = _s["_source"]["tags"] if not tags: tags = [] isp = False has_children = False a_attr = {} if not is_dir and _s["_source"]["pin"] == 1: a_attr = {'style': 'color:red'} if PRODUCT_TAG in tags: if not a_attr: a_attr = {'style': 'color:green'} isp = True if t_tag in tags: is_free = True if is_dir: # icon_val = "jstree-folder" icon_val = "folder" has_children = True else: f_type = guess_file_type(txt) if f_type: icon_val = "jstree-file file-%s" % f_type node_text = txt format_size = scale_size(_s["_source"]["size"]) price = self.parse_price(format_size, 2) if format_size: node_text = "{}({})".format(node_text, format_size) if is_free: node_text = "[{}]{}".format(t_tag, node_text) if not a_attr: a_attr = {'style': 'color:green'} if isp: node_text = "[{}]{}".format(PRODUCT_TAG, node_text) fs_id = _s["_source"]["fs_id"] item_id = _s["_source"]["id"] item_fuzzy_id = obfuscate_id(item_id) node_param = { "id": item_fuzzy_id, "text": node_text, "data": { "path": _s["_source"]["path"], "server_ctime": _s["_source"].get("server_ctime", 0), "isdir": _s["_source"]["isdir"], "source": _s["_source"]["source"], "fs_id": fs_id, "pin": _s["_source"]["pin"], "_id": item_fuzzy_id, "isp": isp, "tags": tags, "sourceid": _s["_source"]["sourceid"], "p_id": _s["_source"]["id"], "price": price, "fn": ori_fn_name, "alias": ori_aliasname }, "children": has_children, "icon": icon_val } if a_attr: node_param['a_attr'] = a_attr params.append(node_param) return params
def query_share_list(self, parent_item_id): params = [] sp: SearchParams = SearchParams.build_params(0, 1000) # sp.add_must(is_match=False, field="path", value=parent_path) if parent_item_id: sp.add_must(is_match=False, field="parent", value=parent_item_id) else: sp.add_must(is_match=False, field="pos", value=SHARE_ES_TOP_POS) sp.add_must(is_match=False, field="parent", value=0) # sp.add_must(is_match=False, field="isdir", value=0) es_body = build_query_item_es_body(sp) print("query_share_list es_body:", es_body) es_result = es_dao_share().es_search_exec(es_body) hits_rs = es_result["hits"] total = hits_rs["total"] print("query_share_list files es total:", total) for _s in hits_rs["hits"]: icon_val = "jstree-file" fn_name = _s["_source"]["filename"] txt = fn_name aliasname = '' if "aliasname" in _s["_source"] and _s["_source"]["aliasname"]: aliasname = _s["_source"]["aliasname"] if aliasname: fn_name, extname = split_filename(fn_name) alias_fn, alias_extname = split_filename(aliasname) if not alias_extname: alias_extname = extname aliasname = "{}{}".format( alias_fn, "." + alias_extname if alias_extname.strip() else "") txt = "[{}]{}".format(fn_name, aliasname) has_children = False a_attr = {} if _s["_source"]["isdir"] == 1: # icon_val = "jstree-folder" icon_val = "folder" has_children = True if _s["_source"]["pin"] == 1: a_attr = {'style': 'color:red'} else: f_type = guess_file_type(txt) if f_type: icon_val = "jstree-file file-%s" % f_type node_text = txt format_size = scale_size(_s["_source"]["size"]) if format_size: if _s["_source"]["isdir"] == 1: node_text = "{}(shared)({})".format(node_text, format_size) else: node_text = "{}({})".format(node_text, format_size) node_param = { "id": "s_%s" % _s["_source"]["id"], "text": node_text, "data": { "path": _s["_source"]["path"], "fs_id": _s["_source"]["fs_id"], "server_ctime": _s["_source"].get("server_ctime", 0), "isdir": _s["_source"]["isdir"], "source": _s["_source"]["source"], "pin": _s["_source"]["pin"], "_id": _s["_source"]["id"], "sourceid": _s["_source"]["sourceid"], "p_id": _s["_source"]["fs_id"] }, "children": has_children, "icon": icon_val } if a_attr: node_param['a_attr'] = a_attr params.append(node_param) return params
def query_file_list(self, parent_item_id): item_list = DataDao.query_data_item_by_parent(parent_item_id, True, limit=1000) params = [] for item in item_list: _item_path = item.path txt = item.filename if item.aliasname: txt = item.aliasname item_fuzzy_id = obfuscate_id(item.id) format_size = scale_size(item.size) # print("id:", item.id, ",item_fuzzy_id:", item_fuzzy_id) params.append({ "id": item_fuzzy_id, "text": txt, "data": { "path": _item_path, "_id": item_fuzzy_id, "format_size": format_size, "fs_id": item.fs_id, "category": item.category, "source": "local", "isdir": item.isdir }, "children": True, "icon": "folder" }) # print("dirs total:", len(params)) sp: SearchParams = SearchParams.build_params(0, 1000) # sp.add_must(is_match=False, field="path", value=parent_path) sp.add_must(is_match=False, field="parent", value=parent_item_id) sp.add_must(is_match=False, field="isdir", value=0) es_body = build_query_item_es_body(sp) # logger.info("es_body:{}".format(es_body)) es_result = es_dao_local().es_search_exec(es_body) hits_rs = es_result["hits"] total = hits_rs["total"] logger.info("files es total:{}".format(total)) for _s in hits_rs["hits"]: icon_val = "file" fn_name = _s["_source"]["filename"] category = _s["_source"]["category"] format_size = scale_size(_s["_source"]["size"]) media_type = self.check_data_item_media_type(category, fn_name) txt = fn_name aliasname = None if "aliasname" in _s["_source"] and _s["_source"]["aliasname"]: aliasname = _s["_source"]["aliasname"] if aliasname: fn_name, extname = split_filename(fn_name) alias_fn, alias_extname = split_filename(aliasname) if not alias_extname: alias_extname = extname aliasname = "{}{}".format( alias_fn, "." + alias_extname if alias_extname.strip() else "") # __idx = fn_name.rfind(".") # if __idx > 0: # fn_name = fn_name[0:__idx] txt = "[{}]{}".format(fn_name, aliasname) f_type = guess_file_type(txt) if f_type: icon_val = "file file-%s" % f_type item_fuzzy_id = obfuscate_id(_s["_source"]["id"]) params.append({ "id": obfuscate_id(_s["_source"]["id"]), "text": txt, "data": { "path": _s["_source"]["path"], "isdir": _s["_source"]["isdir"], "source": "local", "media_type": media_type, "format_size": format_size, "category": category, "fs_id": _s["_source"]["fs_id"], "_id": item_fuzzy_id }, "children": False, "icon": icon_val }) return params
def query_file(self, item_id): data_item: DataItem = DataDao.get_data_item_by_id(item_id) need_sync = False logger.info("query_file dlink:{}".format(data_item.dlink)) if not data_item.dlink_updated_at or not data_item.dlink: need_sync = True elif data_item.dlink_updated_at: dt = arrow.get( data_item.dlink_updated_at).replace(tzinfo=self.default_tz) if dt.shift(hours=+DLINK_TIMEOUT) < arrow.now(): need_sync = True account_id = data_item.account_id acc: Accounts = DataDao.account_by_id(account_id) flv_json = None need_thumbs = False # data_item_ext = None # if data_item.category == 1 and is_video_media(data_item.filename): # data_item_ext = DataDao.get_data_item_ext_by_id(data_item.id) if is_image_media(data_item.filename) and data_item.category == 3: need_thumbs = True if need_sync: pan_acc: PanAccounts = self.get_pan_account( data_item.panacc, data_item.account_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(data_item.fs_id), need_thumbs) if sync_dlink: data_item.dlink = "{}&access_token={}".format( sync_dlink, pan_acc.access_token) data_item.dlink_updated_at = get_now_datetime() data_item_params = { "dlink": data_item.dlink, "dlink_updated_at": data_item.dlink_updated_at } if need_thumbs: if "url3" in thumbs: data_item_params["thumb"] = thumbs["url3"] data_item.thumb = data_item_params["thumb"] elif "url2" in thumbs: data_item_params["thumb"] = thumbs["url2"] data_item.thumb = data_item_params["thumb"] elif "url1" in thumbs: data_item_params["thumb"] = thumbs["url1"] data_item.thumb = data_item_params["thumb"] elif "icon" in thumbs: data_item_params["thumb"] = thumbs["icon"] data_item.thumb = data_item_params["thumb"] DataDao.update_data_item(data_item.id, data_item_params) # not authorized # if data_item.category == 1 and is_video_media(data_item.filename): # flv_json = restapi.get_media_flv_info(pan_acc.access_token, data_item.path) # if flv_json and "mlink" in flv_json: # flv_params = {"fs_id": data_item.fs_id, "mlink": flv_json["mlink"], # "start_at_time": flv_json["mlink_start_at"]} # if data_item_ext: # data_item_ext.mlink = flv_params["mlink"] # data_item_ext.start_at_time = flv_params["start_at_time"] # DataDao.update_data_item_ext(data_item.id, flv_params) # else: # data_item_ext = DataDao.new_data_item_ext(data_item.id, flv_params) used_pan_acc_id = data_item.panacc if data_item: data_item.size = int(data_item.size / 1024) f_type = guess_file_type(data_item.filename) params = {"item": DataItem.to_dict(data_item, ['id', 'parent'])} params["item"]["id"] = obfuscate_id(data_item.id) params["item"]["type"] = f_type params["item"]["media_type"] = self.check_data_item_media_type( data_item.category, data_item.filename) params["item"]["dlink_tokens"] = [used_pan_acc_id] # if data_item.category == 1 and is_video_media(data_item.filename) and data_item_ext: # params["item"]["mlink"] = data_item_ext.mlink # params["item"]["start_at_time"] = data_item_ext.start_at_time return params