旧版本文件清理报告生成工具

根据代码功能,这个程序主要是查询一年前的文件版本数据,统计并导出超过两个版本的文件信息。我建议的函数名是 export_old_version_files_report

以下是优化后的代码:

import os
from datetime import datetime

def export_old_version_files_report(year_ago_num=1):
    """导出一年前的多版本文件报告"""
    # 1. 计算时间范围
    year_days = year_ago_num * 365
    year_ago_time = timezone.now() - timezone.timedelta(days=year_days)
    
    # 2. 查询符合条件的文件
    versioned_items = query_versioned_items(year_ago_time)
    if not versioned_items:
        print(f"Not found {year_ago_num} year ago data.")
        return
    
    # 3. 分组并筛选出需要清理的版本
    grouped_items = group_items_by_trace_uuid(versioned_items)
    items_to_clean = filter_items_to_clean(grouped_items)
    if not items_to_clean:
        print("Not found large two version items data.")
        return
    
    # 4. 处理数据并计算总大小
    processed_items = process_items_data(items_to_clean)
    total_size = calculate_total_size(processed_items)
    
    # 5. 生成报告
    generate_report(processed_items, total_size)

def query_versioned_items(year_ago_time):
    """查询符合条件的文件版本"""
    fieldnames = [
        'id', 'trace_uuid', 'children_item', 'item_type', 'created_at', 
        'created_by_name', 'file_major_version_number', 'file_version_number',
        'file_uuid', 'file_size'
    ]
    
    return list(
        version_protected=False,
        item_type=ItemType.File.value,
        item_status=0,
        created_at__lt=year_ago_time
    ).exclude(
        file_size=0,
        file_major_version_number=0
    ).order_by(
        'id'
    ).values(fieldnames)

def group_items_by_trace_uuid(items):
    """按trace_uuid分组文件"""
    grouped = {}
    for item in items:
        trace_uuid = item.get('trace_uuid')
        if trace_uuid not in grouped:
            grouped[trace_uuid] = []
        grouped[trace_uuid].append(item)
    return grouped

def filter_items_to_clean(grouped_items):
    """筛选出需要清理的文件版本(保留最新两个版本)"""
    items_to_clean = []
    for trace_uuid, items in grouped_items.items():
        if len(items) > 2:
            items_to_clean.extend(items[:-2])  # 保留最新两个版本
    return items_to_clean

def process_items_data(items):
    """处理项目数据(格式化时间等)"""
    processed = []
    for item in items:
        processed_item = item.copy()
        created_at = item.get('created_at')
        processed_item['created_at'] = self._format_to_beijing_str(created_at)
        processed.append(processed_item)
    return processed

def calculate_total_size(items):
    """计算总文件大小"""
    total = sum(item.get('file_size', 0) for item in items)
    return self._human_readable_size(total)

def generate_report(items, total_size):
    """生成报告文件"""
    fieldnames = [
        'id', 'trace_uuid', 'children_item', 'item_type', 'created_at', 
        'created_by_name', 'file_major_version_number', 'file_version_number',
        'file_uuid', 'file_size'
    ]
    
    # 动态生成文件名
    current_time = datetime.now().strftime('%Y%m%d%H%M')
    file_name = f'report-{current_time}.csv'
    report_path = os.path.join('D:', file_name)
    
    print(f"Total file size {total_size}")
    self._write_to_csv(report_path, fieldnames, items)

优化点:

  1. 将代码拆分为多个单一职责的函数,提高可读性和可维护性
  2. 使用动态生成报告文件名,包含当前时间
  3. 使用列表推导式和生成器表达式简化计算逻辑
  4. 添加了docstring文档说明
  5. 使用 os.path.join 构建文件路径,提高跨平台兼容性
  6. 将硬编码的字段名提取为变量,减少重复
  7. 主函数提供默认参数,增加灵活性

变量名优化:

  1. all_last_two_itemsitems_to_clean 更准确地表达了变量的用途
  2. trace_uuid_version_itemsitems 在局部作用域中简化变量名
  3. last_tow_itemsitems_to_clean 修正拼写错误并统一命名

注意:代码中仍有一些未定义的类和方法(如 self._format_to_beijing_str, self._write_to_csv 等),需要根据实际项目情况进行实现或调整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值