File size: 2,631 Bytes
e7f1d57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# Dependencies
import re
import uuid
import hashlib
from pathlib import Path
from datetime import datetime
from datetime import timedelta
from utils.logger import get_logger


# Setup Logging
logger = get_logger(__name__)


def generate_unique_id() -> str:
    """
    Generate unique ID for files/reports
    """
    unique_id = f"{datetime.now().strftime('%Y%m%d_%H%M%S')}_{uuid.uuid4().hex[:8]}"
    
    return unique_id


def calculate_hash(file_path: Path) -> str:
    """
    Calculate SHA256 hash of file
    """
    sha256 = hashlib.sha256()

    with open(file_path, 'rb') as f:
        for chunk in iter(lambda: f.read(8192), b''):
            sha256.update(chunk)
    
    hash = sha256.hexdigest()

    return hash


def format_filesize(size_bytes: int) -> str:
    """
    Format file size in human-readable format
    """
    for unit in ['B', 'KB', 'MB', 'GB']:
        if (size_bytes < 1024.0):
            return f"{size_bytes:.2f} {unit}"

        size_bytes /= 1024.0

    file_size = f"{size_bytes:.2f} TB"
    
    return file_size


def cleanup_old_files(directory: Path, days: int = 7) -> int:
    """
    Clean up files older than specified days
    
    Arguments:
    ----------
        directory { Path } : Directory to clean
        
        days      { int }  : Files older than this will be deleted
    
    Returns:
    --------
            { int }        : Number of files deleted
    """
    if not directory.exists():
        return 0
    
    cutoff  = datetime.now() - timedelta(days = days)
    deleted = 0
    
    for file_path in directory.iterdir():
        if file_path.is_file():
            file_time = datetime.fromtimestamp(file_path.stat().st_mtime)
            
            if (file_time < cutoff):
                try:
                    file_path.unlink()
                    deleted += 1
                    logger.debug(f"Deleted old file: {file_path.name}")

                except Exception as e:
                    logger.error(f"Failed to delete {file_path.name}: {e}")
    
    if (deleted > 0):
        logger.info(f"Cleaned up {deleted} files from {directory.name}")
    
    return deleted


def safe_filename(filename: str) -> str:
    """
    Sanitize filename for safe storage
    """
    # Remove any path components
    filename = Path(filename).name
    
    # Replace unsafe characters
    filename = re.sub(r'[^\w\s.-]', '', filename)
    
    # Limit length
    if (len(filename) > 255):
        name, ext = filename.rsplit('.', 1) if '.' in filename else (filename, '')
        filename  = name[:250] + ('.' + ext if ext else '')
        
    return filename