Example #1
0
def file_delete(request, project_id):
    fid = request.GET.get('fid')
    delete_object = models.FileRepository.objects.filter(id=int(fid), project=request.auth.project).first()
    if delete_object.file_type == 1:
        # 删除文件,返还使用空间
        request.auth.project.used_space -= delete_object.file_size
        request.auth.project.save()
        # cos操作删除文件
        delete_file(request.auth.project.bucket, request.auth.project.region, delete_object.key)
        # 数据库中删除
        delete_object.delete()
        return JsonResponse({'status': True})
    total_size = 0
    key_list = []
    folder_list = [delete_object, ]
    for folder in folder_list:
        child_list = models.FileRepository.objects.filter(project=request.auth.project, parent=folder).order_by(
            '-file_type')
        for child in child_list:
            if child.file_type == 2:
                folder_list.append(child)
            else:
                total_size += child.file_size
                key_list.append({'Key': child.key})
    if key_list:
        delete_file_list(request.auth.project.bucket, request.auth.project.region, key_list)
    if total_size:
        request.auth.project.used_space -= total_size
        request.auth.project.save()
    delete_object.delete()
    return JsonResponse({'status': True})
Example #2
0
def file_delete(request, project_id):
    """ 删除文件 """
    fid = request.GET.get('fid')

    # 删除数据库中的 文件 & 文件夹 (级联删除)
    delete_object = models.FileRepository.objects.filter(
        id=fid, project=request.tracer.project).first()
    if delete_object.file_type == 1:
        # 删除文件(数据库文件删除、cos文件删除、项目已使用空间容量还回去)
        request.tracer.project.use_space -= delete_object.file_size
        request.tracer.project.save()
        request.tracer.project.use_space -= delete_object.file_size
        request.tracer.project.save()

        # cos中删除文件
        delete_file(request.tracer.project.bucket, settings.BUCKET_REGION,
                    delete_object.key)

        # 在数据库中删除当前文件
        delete_object.delete()

        return JsonResponse({'status': True})
    # 删除文件夹(找到文件夹下所有的文件->数据库文件删除、cos文件删除、项目已使用空间容量还回去)
    # delete_object
    # 找他下面的 文件和文件夹
    # models.FileRepository.objects.filter(parent=delete_object) # 文件 删除;文件夹 继续向里查

    total_size = 0
    key_list = []

    folder_list = [
        delete_object,
    ]
    for folder in folder_list:
        child_list = models.FileRepository.objects.filter(
            project=request.tracer.project,
            parent=folder).order_by('-file_type')
        for child in child_list:
            if child.file_type == 2:
                folder_list.append(child)
            else:
                # 文件大小汇总
                total_size += child.file_size

                # 删除文件
                key_list.append({"Key": child.key})

    # cos 批量删除文件
    if key_list:
        delete_file_list(request.tracer.project.bucket,
                         request.tracer.project.region, key_list)

    # 归还容量
    if total_size:
        request.tracer.project.use_space -= total_size
        request.tracer.project.save()

    # 删除数据库中的文件
    delete_object.delete()
    return JsonResponse({'status': True})
Example #3
0
def file_delete(request, project_id):
    """文件&&文件夹的删除"""
    if request.method == "GET":
        # 获取文件ID
        fid = request.GET.get('fid', None)
        # 删除文件或者文件夹
        delete_obj = FileRepository.objects.filter(
            id=fid, project=request.tracer.project).first()

        if delete_obj.file_type == 1:
            # 删除文件,需要释放cos

            # 将容量释放
            request.tracer.project.use_space -= delete_obj.file_size
            request.tracer.project.save()

            # cos中删除文件
            delete_file(bucket=request.tracer.project.bucket,
                        key=delete_obj.key,
                        region=request.tracer.project.region)

            # 数据库文件删除
            delete_obj.delete()

            return JsonResponse({'code': 200})

        else:
            # 删除文件夹及文件夹内的文件
            total_size = 0
            key_list = []  # 文件名列表
            folder_list = [delete_obj]

            for folder in folder_list:
                child_list = FileRepository.objects.filter(
                    project=request.tracer.project,
                    child=folder).order_by('-file_type')

                for child in child_list:
                    if child.file_type == 1:
                        # 表示文件夹
                        folder_list.append(child)
                    else:
                        # 表示是文件
                        total_size += child.file_size
                        key_list.append({"Key": child.key})
            # 删除文件
            delete_file_list(bucket=request.tracer.project.bucket,
                             key_list=key_list,
                             region=request.tracer.project.region)

            # 释放空间
            request.tracer.project.use_space -= total_size
            request.tracer.project.save()

            # 删除文件夹
            delete_obj.delete()

            return JsonResponse({'code': 200})
Example #4
0
def file_delete(request, project_id):
    """删除文件"""
    fid = request.GET.get("fid")

    # 删除数据库中文件和文件夹的信息,级联删除
    delete_obj = FileRepository.objects.filter(
        id=fid, project=request.tracer.project).first()

    # 同时删除桶中的信息
    if delete_obj.file_type == 1:
        # 文件 --> 数据库删除,cos文件删除,项目已使用的空间容量返还

        # 删除文件,将容量还给当前项目的已使用空间
        request.tracer.project.user_space -= delete_obj.file_size
        request.tracer.project.save()

        # COS中删除文件
        delete_file(request.tracer.project.bucket, TENCENT_COS_REGION,
                    delete_obj.key)

        # 数据库中删除记录
        delete_obj.delete()

        return JsonResponse({"status": True})

    # 文件夹 --> 找到当前文件夹中的所有文件 --> (数据库删除,cos文件删除,项目已使用的空间容量返还)
    # 反向查询?!递归修改数据
    total_size = 0
    key_list = []
    folder_list = [
        delete_obj,
    ]
    for folder in folder_list:
        child_list = FileRepository.objects.filter(
            project=request.tracer.project,
            parent=folder).order_by('-file_type')
        for child in child_list:  # 遍历文件和文件夹
            if child.file_type == 2:
                folder_list.append(child)
            else:
                # 这个时候-->处理文件
                total_size += child.file_type
                # delete_file(request.tracer.project.bucket, request.tracer.project.region, child.key)
                key_list.append({"Key": child.key})

    # COS批量删除文件
    if key_list:
        delete_file_list(request.tracer.project.bucket,
                         request.tracer.project.region, key_list)

    # 归还文件大小
    if total_size:
        request.tarcer.project.user_space -= delete_obj.file_size
        request.tracer.project.save()

    delete_obj.delete()
    return JsonResponse({"status": True})
Example #5
0
def file_delete(request, project_id):
    """
      删除文件(数据库中文件删除,cos文件删除,当前项目已使用的空间容量还原
      删除文件夹(找到该文件夹下所有的文件都要进行-->数据库中和cos删除,当前项目已使用的空间容量还原
    :param request:
    :param project:
    :return:
    """
    fid = request.GET.get("fid")
    # 删除数据库中的文件 & 文件夹 (级联删除)
    delete_object = models.FileRepository.objects.filter(
        id=fid, project=request.tracer.project).first()
    if delete_object.file_type == 1:
        # 删除文件(数据库中文件删除,cos文件删除,当前项目已使用的空间容量还原
        # 删除文件时,将容量还给当前项目。先找到当前项目已使用空间,然后减去当前文件大小
        request.tracer.project.user_space -= delete_object.file_size  # 单位是字节
        request.tracer.project.save()
        # cos中删除文件
        delete_file(request.tracer.project.bucket,
                    request.tracer.project.region, delete_object.key)
        # 在数据库中删除
        delete_object.delete()
        return JsonResponse({'status': True})

    # 删除文件夹(找到该文件夹下所有的文件都要进行-->数据库中和cos删除,当前项目已使用的空间容量还原
    total_size = 0
    key_list = []  # 文件所有的key

    folder_list = [
        delete_object,
    ]  # 目录列表
    for folder in folder_list:  # 文件夹下面的所有文件和文件夹
        child_list = models.FileRepository.objects.filter(
            project=request.tracer.project,
            parent=folder).order_by("-file_type")
        for child in child_list:
            if child.file_type == 2:  # 文件夹,添加到folder_list中
                folder_list.append(child)
            else:  # 文件大小汇总
                total_size += child.file_size
                # 删除文件,每次都删除一个文件,效率低
                # delete_file(request.tracer.project.bucket, request.tracer.project.region, child.key)
                # 腾讯提供的批量删除
                key_list.append({"Key": child.key})
    # cos批量删除文件
    if key_list:
        delete_file_list(request.tracer.project.bucket,
                         request.tracer.project.region, key_list)
    # 归还容量
    if total_size:
        request.tracer.project.user_space -= total_size
        request.tracer.project.save()
    # 删除数据库中的文件
    delete_object.delete()
    return JsonResponse({"status": True})
Example #6
0
def file_delete(request, project_id):
    """删除文件"""
    fid = request.GET.get('fid')

    delete_object = FileRepository.objects.filter(id=int(fid), project_id=project_id).first()
    # cos操作需要传递的参数
    bucket_name = request.tracer.project.bucket  # 桶名称
    region = request.tracer.project.region   # 桶所在的区域
    key = delete_object.key    # 要删除的文件名称

    if delete_object.file_type == 1:
        # todo 删除文件(数据库文件删除, cos文件删除,项目已经使用的空间更新)
        # 1、归还项目已经使用空间
        request.tracer.project.use_space -= delete_object.file_size    # 文件空间使用字节为单位
        request.tracer.project.save()

        # 2、cos 文件删除
        delete_file(bucket_name, region, key)

        # 3、数据库中删除文件
        delete_object.delete()

        return JsonResponse({'status': True})

    else:
        # todo 删除文件夹(找到文件夹中的所有文件数据库文件删除, cos文件删除,项目已经使用的空间更新)
        total_size = 0
        delete_key_list = []
        # 1、使用队列遍历文件夹及其所有子文件夹, 找到所有需要删除的文件
        folder_list = [delete_object]
        for folder in folder_list:
            child_list = FileRepository.objects.filter(project_id=project_id, parent=folder).order_by('-file_type')
            for child in child_list:
                if child.file_type == 2:
                    # 如果是文件夹加入到队列中
                    folder_list.append(child)
                else:
                    # 如果是文件,计算容量,将文件存储在COS中的名称加入到删除列表,不放入队列
                    total_size += child.file_size

                    delete_key_list.append({'Key': child.key})

        # 2、cos中批量删除
        if delete_key_list:
            delete_file_list(bucket_name, region, delete_key_list)

        # 3、归还项目已经使用空间
        if total_size:
            request.tracer.project.use_space -= total_size  # 文件空间使用字节为单位
            request.tracer.project.save()

        # 4、数据库中删除文件
        delete_object.delete()
        return JsonResponse({'status': True})
Example #7
0
def file_delete(request, project_id):
    """删除文件"""
    fid = request.GET.get('fid')
    # 删除数据库中的文件和文件夹(内部已经包含级联删除)
    delete_object = models.FileRepository.objects.filter(
        id=fid, project=request.bug_mgt.project).first()
    if delete_object.file_type == 1:
        # 删除文件(数据库文件删除,cos文件删除,项目已使用空间回收)
        # 释放空间
        request.bug_mgt.project.used_space -= delete_object.size
        request.bug_mgt.project.save()
        # cos中删除文件
        delete_file(request.bug_mgt.project.bucket,
                    request.bug_mgt.project.region, delete_object.key)
        # 在数据库中删除文件
        delete_object.delete()
        return JsonResponse({'status': True})
    else:
        # 删除文件夹(找到文件夹下所有文件->数据库文件删除,cos文件删除,项目已使用空间回收)
        # 设置总的释放空间的变量
        total_size = 0
        # 设置用于存放要删除的文件的唯一文件名
        key_list = []
        # 设置文件夹集合,用于存放要遍历的文件夹
        folder_list = [
            delete_object,
        ]
        for folder in folder_list:
            child_list = models.FileRepository.objects.filter(
                project=request.bug_mgt.project,
                parent=folder).order_by('-file_type')
            for child in child_list:
                if child.file_type == 2:
                    folder_list.append(child)
                else:
                    # 否则的话就是文件,对文件大小汇总
                    total_size += child.size
                    # 删除文件
                    key_list.append({'Key': child.key})
        # cos中删除文件
        if key_list:
            delete_file_list(request.bug_mgt.project.bucket,
                             request.bug_mgt.project.region, key_list)
        # 释放空间
        if total_size:
            request.bug_mgt.project.used_space -= total_size
            request.bug_mgt.project.save()
        # 在数据库中删除文件
        delete_object.delete()
        return JsonResponse({'status': True})
Example #8
0
def file_delete(request, project_id):
    """删除文件
       级联删除"""
    fid = request.GET.get('fid')
    delete_object = models.FileRepository.objects.filter(
        id=fid, project=request.tracer.project).first()
    if delete_object.file_type == 1:
        # 删除文件
        request.tracer.project.use_space -= delete_object.file_size
        request.tracer.project.save()

        # cos中删除文件
        delete_file(request.tracer.project.bucket,
                    request.tracer.project.region, delete_object.key)
        delete_object.delete()
        return JsonResponse({'status': True})

    else:
        # 删除文件夹
        models.FileRepository.objects.filter(parent=delete_object)
        total_size = 0
        folder_list = [delete_object]
        key_list = []
        for folder in folder_list:
            child_list = models.FileRepository.objects.filter(
                project=request.tracer.project,
                parent=folder).order_by('-file_type')
            for child in child_list:
                if child.file_type == 2:
                    folder_list.append(child)
                else:
                    total_size += child.file_size
                    # 删除文件
                    key_list.append({'Key': child.key})

        if key_list:
            delete_file_list(request.tracer.project.bucket,
                             request.tracer.project.region, key_list)
        if total_size:
            request.tracer.project.use_space -= total_size
            request.tracer.project.save()
        delete_object.delete()
        return JsonResponse({'status': True})
Example #9
0
def file_delete(request, project_id):
    fid = request.GET.get('fid')
    # 删除数据库中的文件及文件夹 级联删除
    del_obj = models.FileRepository.objects.filter(
        id=fid, project_id=project_id).first()
    if del_obj.file_type == 1:
        # 删除文件 并将存储空间进行更新
        request.userInfo.project.use_space -= del_obj.file_size
        request.userInfo.project.save()
        # 删除cos文件
        delete_file(bucket_name=request.userInfo.project.bucket,
                    bucket_region=request.userInfo.project.region,
                    key=del_obj.key)
    else:
        # 删除文件夹 total_size统计文件下子文件的大小 key_list 保存文件下所有子文件的cos文件名
        total_size = 0
        key_list = []
        folder_obj_list = [
            del_obj,
        ]
        for folder_obj in folder_obj_list:
            child_list = models.FileRepository.objects.filter(
                project=request.userInfo.project, parent_file=folder_obj)
            for child in child_list:
                if child.file_type == 2:
                    # 文件夹
                    folder_obj_list.append(child)
                else:
                    # 文件
                    total_size += child.file_size
                    key_list.append({'Key': child.key})
        # 删除cos中 文件夹下所有的文件
        if key_list:
            delete_file_list(bucket_name=request.userInfo.project.bucket,
                             bucket_region=request.userInfo.project.region,
                             key_list=key_list)
        if total_size:
            request.userInfo.project.use_space -= total_size
            request.userInfo.project.save()
    # 删除数据库所有的文件信息
    del_obj.delete()
    return JsonResponse({'status': True})
Example #10
0
def file_delete(request, project_id):
    """删除文件"""
    fid = request.GET.get('fid')
    #级连删除(仅删除了数据库文件)
    delete_object = models.FileRepository.objects.filter(
        id=fid, project=request.blog.project).first()
    print(delete_object)
    if delete_object.file_type == 1:
        #删除文件(数据库文件删除,cos文件删除,返回使用空间)
        #删除文件,将容量返回给当前项目已使用空间
        request.blog.project.user_space -= delete_object.file_size
        request.blog.project.save()
        #cos删除文件
        delete_file(request.blog.project.bucket, request.blog.project.region,
                    delete_object.key)
        #zai数据库删除当前文件
        delete_object.delete()
        return JsonResponse({'status': True})

    total_size = 0
    key_list = []

    folder_list = [
        delete_object,
    ]
    for folder in folder_list:
        child_list = models.FileRepository.objects.filter(
            project=request.blog.project, parent=folder).order_by('-file_type')
        for child in child_list:
            if child.file_type == 2:
                folder_list.append(child)
            else:
                total_size += child.file_size
                key_list.append({"Key": child.key})
    if key_list:
        delete_file_list(request.blog.project.bucket,
                         request.blog.project.region, key_list)
    if total_size:
        request.blog.project.user_space -= total_size
        request.blog.project.save()
    delete_object.delete()
    return JsonResponse({'status': True})
Example #11
0
def delete_view(request):
    """
    删除文件(夹)
    """
    delete_id = request.GET.get('did')
    delete_object = FileRepository.objects.filter(
        id=delete_id, update_user=request.user).first()
    if delete_object.file_type == 1:  # 删除文件
        # cos中删除文件
        delete_file(bucket=request.user.bucket,
                    region=request.user.region,
                    key=delete_object.key)
        # 数据库中删除文件
        delete_object.delete()
    else:  # 删除文件夹
        # 设置一个队列q,bfs删除文件(夹)
        q = [delete_object]
        hh, tt = 0, 0
        key_list = []  # 待删除的文件列表,每个元素的格式为 {'Key': key}
        while hh <= tt:  # 当q不空
            # 取出队头文件夹
            t = q[hh]
            hh += 1
            # 遍历t下的所有文件(夹)
            file_list = FileRepository.objects.filter(update_user=request.user,
                                                      parent=t)
            for file in file_list:
                if file.file_type == 1:  # file是文件
                    key_list.append({'Key': file.key})
                else:  # file是文件夹
                    q.append(file)
                    tt += 1

        if key_list:
            # cos批量删除文件
            delete_file_list(bucket=request.user.bucket,
                             region=request.user.region,
                             key_list=key_list)
        # 在数据库中删除文件夹
        delete_object.delete()

    return JsonResponse({'status': True})