Coverage for src / lexigram / admin / services / storage / utils.py: 37%

19 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-08-13 22:14 +0800

1""" 

2Utility functions for admin storage service. 

3 

4Provides path generation, content type detection, and other helper functions. 

5""" 

6 

7from __future__ import annotations 

8 

9import mimetypes 

10from pathlib import Path 

11from typing import Any 

12from uuid import uuid4 

13 

14 

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. 

22 

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 

28 

29 Returns: 

30 Unique storage path 

31 

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] 

38 

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 ".-_") 

42 

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}") 

50 

51 return "/".join(parts) 

52 

53 

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"