Ejemplo n.º 1
0
 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
Ejemplo n.º 2
0
 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
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
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
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
    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
Ejemplo n.º 7
0
    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
Ejemplo n.º 8
0
    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