Coverage for src/lexigram/admin/services/storage/utils.py: 0%
19 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-24 23:18 +0800
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-24 23:18 +0800
1"""
2Utility functions for admin storage service.
4Provides path generation, content type detection, and other helper functions.
5"""
7from __future__ import annotations
9import mimetypes
10from pathlib import Path
11from typing import Any
12from uuid import uuid4
15def generate_upload_path(
16 filename: str,
17 resource_type: str | None = None,
18 resource_id: Any = None,
19 base_path: str = "uploads",
20) -> str:
21 """Generate unique upload path.
23 Args:
24 filename: Original filename
25 resource_type: Optional resource type for organization
26 resource_id: Optional resource ID
27 base_path: Base path prefix
29 Returns:
30 Unique storage path
32 Example:
33 >>> generate_upload_path("avatar.jpg", "users", 123)
34 "uploads/users/123/abc123_avatar.jpg"
35 """
36 # Generate unique prefix
37 unique_id = uuid4().hex[:8]
39 # Sanitize filename
40 safe_filename = Path(filename).name
41 safe_filename = "".join(c for c in safe_filename if c.isalnum() or c in ".-_")
43 # Build path
44 parts = [base_path]
45 if resource_type:
46 parts.append(resource_type)
47 if resource_id:
48 parts.append(str(resource_id))
49 parts.append(f"{unique_id}_{safe_filename}")
51 return "/".join(parts)
54def get_content_type(filename: str) -> str:
55 """Get content type from filename."""
56 content_type, _ = mimetypes.guess_type(filename)
57 return content_type or "application/octet-stream"