def get_locked_files_by_dir(request, repo_id, folder_path): """ Get locked files in a folder Returns: A dict contains locked file name and locker owner. locked_files = { 'file_name': 'lock_owner'; ... } """ username = request.user.username # get lock files dir_id = seafile_api.get_dir_id_by_path(repo_id, folder_path) dirents = seafile_api.list_dir_with_perm(repo_id, folder_path, dir_id, username, -1, -1) locked_files = {} for dirent in dirents: if dirent.is_locked: locked_files[dirent.obj_name] = dirent.lock_owner return locked_files
def get(self, request, repo_id, format=None): """ Get all file/folder in a library """ repo = seafile_api.get_repo(repo_id) parent_dir = request.GET.get('parent_dir', '/') parent_dir = normalize_dir_path(parent_dir) dir_id = seafile_api.get_dir_id_by_path(repo_id, parent_dir) if not dir_id: error_msg = 'Folder %s not found.' % parent_dir return api_error(status.HTTP_404_NOT_FOUND, error_msg) repo_owner = get_repo_owner(request, repo_id) try: dirs = seafile_api.list_dir_with_perm(repo_id, parent_dir, dir_id, repo_owner, -1, -1) except SearpcError as e: logger.error(e) error_msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) return_results = {} return_results['repo_name'] = repo.repo_name return_results['repo_id'] = repo.repo_id return_results['is_system_library'] = True if \ repo.id == get_system_default_repo_id() else False return_results['dirent_list'] = [] for dirent in dirs: dirent_info = get_dirent_info(dirent) return_results['dirent_list'].append(dirent_info) return Response(return_results)
def get_file_folder_num(self, repo_owner, repo_id, parent_dir): dir_id = seafile_api.get_dir_id_by_path(repo_id, parent_dir) dirents = seafile_api.list_dir_with_perm(repo_id, parent_dir, dir_id, repo_owner, -1, -1) return len(dirents)
def get(self, request, group_id): """ List group repo contents currently one group -> one workspace -> one repo """ group_id = int(group_id) try: group = ccnet_api.get_group(group_id) except Exception as e: logging.error(e) return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, 'Internal Server Error.') if not group: error_msg = 'Group %s not found.' % group_id return api_error(status.HTTP_404_NOT_FOUND, error_msg) owner = '%s@seafile_group' % group_id workspace = Workspaces.objects.get_workspace_by_owner(owner) if not workspace: error_msg = 'Workspace not found.' return api_error(status.HTTP_404_NOT_FOUND, error_msg) repo_id = workspace.repo_id repo = seafile_api.get_repo(repo_id) if not repo: error_msg = 'Library %s not found.' % repo_id return api_error(status.HTTP_404_NOT_FOUND, error_msg) parent_dir = request.GET.get('parent_dir', '/') dir_id = seafile_api.get_dir_id_by_path(repo_id, parent_dir) if not dir_id: error_msg = 'Folder %s not found.' % parent_dir return api_error(status.HTTP_404_NOT_FOUND, error_msg) # dtable's repo_owner if always 'dtable@seafile', not same as workspace and group owner try: repo_owner = get_repo_owner(request, repo_id) dirs = seafile_api.list_dir_with_perm(repo_id, parent_dir, dir_id, repo_owner, -1, -1) except Exception as e: logger.error(e) return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, 'Internal Server Error') # convert dirent obj to dict and exclude '*.dtable' files. dirent_list = [ get_dirent_info(dir) for dir in dirs if '.dtable' not in dir.obj_name ] return Response({ 'dirent_list': dirent_list, 'group_name': group.group_name, })
def get_dirent_name_list(username, repo_id, parent_path): file_name_list = [] folder_name_list = [] path_id = seafile_api.get_dir_id_by_path(repo_id, parent_path) dirs = seafile_api.list_dir_with_perm(repo_id, parent_path, path_id, username, -1, -1) for dirent in dirs: if stat.S_ISDIR(dirent.mode): folder_name_list.append(dirent.obj_name) else: file_name_list.append(dirent.obj_name) return folder_name_list, file_name_list
def get_sub_folder_permission_by_dir(request, repo_id, parent_dir): """ Get sub folder permission in a folder Returns: A dict contains folder name and permission. folder_permission_dict = { 'folder_name_1': 'r'; 'folder_name_2': 'rw'; ... } """ username = request.user.username dir_id = seafile_api.get_dir_id_by_path(repo_id, parent_dir) dirents = seafile_api.list_dir_with_perm(repo_id, parent_dir, dir_id, username, -1, -1) folder_permission_dict = {} for dirent in dirents: if stat.S_ISDIR(dirent.mode): folder_permission_dict[dirent.obj_name] = dirent.permission return folder_permission_dict
def get_dir_file_info_list(username, request_type, repo_obj, parent_dir, with_thumbnail, thumbnail_size): repo_id = repo_obj.id dir_info_list = [] file_info_list = [] # get dirent(folder and file) list parent_dir_id = seafile_api.get_dir_id_by_path(repo_id, parent_dir) dir_file_list = seafile_api.list_dir_with_perm(repo_id, parent_dir, parent_dir_id, username, -1, -1) try: starred_items = UserStarredFiles.objects.filter( email=username, repo_id=repo_id, path__startswith=parent_dir, org_id=-1) starred_item_path_list = [f.path.rstrip('/') for f in starred_items] except Exception as e: logger.error(e) starred_item_path_list = [] # only get dir info list if not request_type or request_type == 'd': dir_list = [ dirent for dirent in dir_file_list if stat.S_ISDIR(dirent.mode) ] for dirent in dir_list: dir_info = {} dir_info["type"] = "dir" dir_info["id"] = dirent.obj_id dir_info["name"] = dirent.obj_name dir_info["mtime"] = dirent.mtime dir_info["permission"] = dirent.permission dir_info["parent_dir"] = parent_dir dir_info_list.append(dir_info) # get star info dir_info['starred'] = False dir_path = posixpath.join(parent_dir, dirent.obj_name) if dir_path.rstrip('/') in starred_item_path_list: dir_info['starred'] = True # only get file info list if not request_type or request_type == 'f': file_list = [ dirent for dirent in dir_file_list if not stat.S_ISDIR(dirent.mode) ] # Use dict to reduce memcache fetch cost in large for-loop. nickname_dict = {} contact_email_dict = {} modifier_set = {x.modifier for x in file_list} lock_owner_set = {x.lock_owner for x in file_list} for e in modifier_set | lock_owner_set: if e not in nickname_dict: nickname_dict[e] = email2nickname(e) if e not in contact_email_dict: contact_email_dict[e] = email2contact_email(e) try: files_tags_in_dir = get_files_tags_in_dir(repo_id, parent_dir) except Exception as e: logger.error(e) files_tags_in_dir = {} for dirent in file_list: file_name = dirent.obj_name file_path = posixpath.join(parent_dir, file_name) file_obj_id = dirent.obj_id file_info = {} file_info["type"] = "file" file_info["id"] = file_obj_id file_info["name"] = file_name file_info["mtime"] = dirent.mtime file_info["permission"] = dirent.permission file_info["parent_dir"] = parent_dir file_info["size"] = dirent.size modifier_email = dirent.modifier file_info['modifier_email'] = modifier_email file_info['modifier_name'] = nickname_dict.get(modifier_email, '') file_info['modifier_contact_email'] = contact_email_dict.get( modifier_email, '') # get lock info if is_pro_version(): file_info["is_locked"] = dirent.is_locked file_info["lock_time"] = dirent.lock_time lock_owner_email = dirent.lock_owner or '' file_info["lock_owner"] = lock_owner_email file_info['lock_owner_name'] = nickname_dict.get( lock_owner_email, '') file_info['lock_owner_contact_email'] = contact_email_dict.get( lock_owner_email, '') if username == lock_owner_email: file_info["locked_by_me"] = True else: file_info["locked_by_me"] = False # get star info file_info['starred'] = False if file_path.rstrip('/') in starred_item_path_list: file_info['starred'] = True # get tag info file_tags = files_tags_in_dir.get(file_name, []) if file_tags: file_info['file_tags'] = [] for file_tag in file_tags: file_info['file_tags'].append(file_tag) # get thumbnail info if with_thumbnail and not repo_obj.encrypted: # used for providing a way to determine # if send a request to create thumbnail. fileExt = os.path.splitext(file_name)[1][1:].lower() file_type = FILEEXT_TYPE_MAP.get(fileExt) if file_type in (IMAGE, XMIND) or \ file_type == VIDEO and ENABLE_VIDEO_THUMBNAIL: # if thumbnail has already been created, return its src. # Then web browser will use this src to get thumbnail instead of # recreating it. thumbnail_file_path = os.path.join(THUMBNAIL_ROOT, str(thumbnail_size), file_obj_id) if os.path.exists(thumbnail_file_path): src = get_thumbnail_src(repo_id, thumbnail_size, file_path) file_info['encoded_thumbnail_src'] = urlquote(src) file_info_list.append(file_info) dir_info_list.sort(key=lambda x: x['name'].lower()) file_info_list.sort(key=lambda x: x['name'].lower()) return dir_info_list, file_info_list
def get_dir_file_info_list(username, request_type, repo_obj, parent_dir, with_thumbnail, thumbnail_size): repo_id = repo_obj.id dir_info_list = [] file_info_list = [] # get dirent(folder and file) list parent_dir_id = seafile_api.get_dir_id_by_path(repo_id, parent_dir) dir_file_list = seafile_api.list_dir_with_perm(repo_id, parent_dir, parent_dir_id, username, -1, -1) try: starred_items = UserStarredFiles.objects.filter(email=username, repo_id=repo_id, path__startswith=parent_dir, org_id=-1) starred_item_path_list = [f.path.rstrip('/') for f in starred_items] except Exception as e: logger.error(e) starred_item_path_list = [] # only get dir info list if not request_type or request_type == 'd': dir_list = [dirent for dirent in dir_file_list if stat.S_ISDIR(dirent.mode)] for dirent in dir_list: dir_info = {} dir_info["type"] = "dir" dir_info["id"] = dirent.obj_id dir_info["name"] = dirent.obj_name dir_info["mtime"] = dirent.mtime dir_info["permission"] = dirent.permission dir_info["parent_dir"] = parent_dir dir_info_list.append(dir_info) # get star info dir_info['starred'] = False dir_path = posixpath.join(parent_dir, dirent.obj_name) if dir_path.rstrip('/') in starred_item_path_list: dir_info['starred'] = True # only get file info list if not request_type or request_type == 'f': file_list = [dirent for dirent in dir_file_list if not stat.S_ISDIR(dirent.mode)] # Use dict to reduce memcache fetch cost in large for-loop. nickname_dict = {} contact_email_dict = {} modifier_set = set([x.modifier for x in file_list]) lock_owner_set = set([x.lock_owner for x in file_list]) for e in modifier_set | lock_owner_set: if e not in nickname_dict: nickname_dict[e] = email2nickname(e) if e not in contact_email_dict: contact_email_dict[e] = email2contact_email(e) try: files_tags_in_dir = get_files_tags_in_dir(repo_id, parent_dir) except Exception as e: logger.error(e) files_tags_in_dir = {} for dirent in file_list: file_name = dirent.obj_name file_path = posixpath.join(parent_dir, file_name) file_obj_id = dirent.obj_id file_info = {} file_info["type"] = "file" file_info["id"] = file_obj_id file_info["name"] = file_name file_info["mtime"] = dirent.mtime file_info["permission"] = dirent.permission file_info["parent_dir"] = parent_dir file_info["size"] = dirent.size modifier_email = dirent.modifier file_info['modifier_email'] = modifier_email file_info['modifier_name'] = nickname_dict.get(modifier_email, '') file_info['modifier_contact_email'] = contact_email_dict.get(modifier_email, '') # get lock info if is_pro_version(): file_info["is_locked"] = dirent.is_locked file_info["lock_time"] = dirent.lock_time lock_owner_email = dirent.lock_owner or '' file_info["lock_owner"] = lock_owner_email file_info['lock_owner_name'] = nickname_dict.get(lock_owner_email, '') file_info['lock_owner_contact_email'] = contact_email_dict.get(lock_owner_email, '') if username == lock_owner_email: file_info["locked_by_me"] = True else: file_info["locked_by_me"] = False # get star info file_info['starred'] = False if file_path.rstrip('/') in starred_item_path_list: file_info['starred'] = True # get tag info file_tags = files_tags_in_dir.get(file_name, []) if file_tags: file_info['file_tags'] = [] for file_tag in file_tags: file_info['file_tags'].append(file_tag) # get thumbnail info if with_thumbnail and not repo_obj.encrypted: # used for providing a way to determine # if send a request to create thumbnail. fileExt = os.path.splitext(file_name)[1][1:].lower() file_type = FILEEXT_TYPE_MAP.get(fileExt) if file_type in (IMAGE, XMIND) or \ file_type == VIDEO and ENABLE_VIDEO_THUMBNAIL: # if thumbnail has already been created, return its src. # Then web browser will use this src to get thumbnail instead of # recreating it. thumbnail_file_path = os.path.join(THUMBNAIL_ROOT, str(thumbnail_size), file_obj_id) if os.path.exists(thumbnail_file_path): src = get_thumbnail_src(repo_id, thumbnail_size, file_path) file_info['encoded_thumbnail_src'] = urlquote(src) file_info_list.append(file_info) dir_info_list.sort(lambda x, y: cmp(x['name'].lower(), y['name'].lower())) file_info_list.sort(lambda x, y: cmp(x['name'].lower(), y['name'].lower())) return dir_info_list, file_info_list
def test_file_property_and_dir_listing(): t_repo_version = 1 t_repo_id = api.create_repo('test_file_property_and_dir_listing', '', USER, passwd=None) create_the_file() api.post_file(t_repo_id, file_path, '/', file_name, USER) api.post_dir(t_repo_id, '/', dir_name, USER) api.post_file(t_repo_id, file_path, '/' + dir_name, file_name, USER) #test is_valid_filename t_valid_file_name = 'valid_filename' t_invalid_file_name = '/invalid_filename' assert api.is_valid_filename(t_repo_id, t_valid_file_name) assert api.is_valid_filename(t_repo_id, t_invalid_file_name) == 0 #test get_file_id_by_path t_file_id = api.get_file_id_by_path(t_repo_id, '/test.txt') assert t_file_id #test get_dir_id_by_path t_dir_id = api.get_dir_id_by_path(t_repo_id, '/test_dir') assert t_dir_id #test get_file_size t_file_size = len(file_content) assert t_file_size == api.get_file_size(t_repo_id, t_repo_version, t_file_id) #test get_dir_size t_dir_size = len(file_content) assert t_dir_size == api.get_dir_size(t_repo_id, t_repo_version, t_dir_id) #test get_file_count_info_by_path t_file_count_info = api.get_file_count_info_by_path(t_repo_id, '/') assert t_file_count_info.file_count == 2 assert t_file_count_info.dir_count == 1 assert t_file_count_info.size == t_file_size + t_dir_size #test get_file_id_by_commit_and_path t_file_id_tmp = t_file_id t_repo = api.get_repo(t_repo_id) assert t_repo t_commit_id = t_repo.head_cmmt_id t_file_id = api.get_file_id_by_commit_and_path(t_repo_id, t_commit_id, '/test.txt') assert t_file_id == t_file_id_tmp #test get_dirent_by_path std_file_mode = 0100000 | 0644 t_dirent_obj = api.get_dirent_by_path(t_repo_id, '/test.txt') assert t_dirent_obj assert t_dirent_obj.obj_id == t_file_id assert t_dirent_obj.obj_name == 'test.txt' assert t_dirent_obj.mode == std_file_mode assert t_dirent_obj.version == t_repo_version assert t_dirent_obj.size == t_file_size assert t_dirent_obj.modifier == USER #test list_file_by_file_id t_block_list = api.list_file_by_file_id(t_repo_id, t_file_id) assert t_block_list #test list_blocks_by_file_id t_block_list = api.list_blocks_by_file_id(t_repo_id, t_file_id) assert t_block_list #test list_dir_by_dir_id t_dir_list = api.list_dir_by_dir_id(t_repo_id, t_dir_id) assert len(t_dir_list) == 1 #test list_dir_by_path t_dir_list = api.list_dir_by_path(t_repo_id, '/test_dir') assert len(t_dir_list) == 1 #test get_dir_id_by_commit_and_path t_dir_id = api.get_dir_id_by_commit_and_path(t_repo_id, t_commit_id, '/test_dir') assert t_dir_id #test list_dir_by_commit_and_path t_dir_list = api.list_dir_by_commit_and_path(t_repo_id, t_commit_id, '/test_dir') assert len(t_dir_list) == 1 #test list_dir_with_perm t_dir_list = api.list_dir_with_perm(t_repo_id, '/test_dir', t_dir_id, USER) assert len(t_dir_list) == 1 #test mkdir_with_parent api.mkdir_with_parents(t_repo_id, '/test_dir', 'test_subdir', USER) t_dir_id = api.get_dir_id_by_path(t_repo_id, '/test_dir/test_subdir') assert t_dir_id #test get_total_storage t_total_size = api.get_total_storage() t_repo_size = api.get_repo_size(t_repo_id) assert t_total_size == t_repo_size #get_total_file_number time.sleep(1) assert api.get_total_file_number() == 2 api.remove_repo(t_repo_id)