Coverage for polar/models/file.py: 95%

39 statements  

« prev     ^ index     » next       coverage.py v7.10.6, created at 2025-12-05 15:52 +0000

1from datetime import datetime 1ab

2from enum import StrEnum 1ab

3from typing import TYPE_CHECKING 1ab

4from uuid import UUID 1ab

5 

6from sqlalchemy import ( 1ab

7 TIMESTAMP, 

8 BigInteger, 

9 Boolean, 

10 ForeignKey, 

11 String, 

12 Uuid, 

13) 

14from sqlalchemy.orm import ( 1ab

15 Mapped, 

16 declared_attr, 

17 mapped_column, 

18 relationship, 

19) 

20 

21from polar.kit.db.models import RecordModel 1ab

22 

23if TYPE_CHECKING: 23 ↛ 24line 23 didn't jump to line 24 because the condition on line 23 was never true1ab

24 from polar.models import ( 

25 Organization, 

26 ) 

27 

28 

29class FileServiceTypes(StrEnum): 1ab

30 downloadable = "downloadable" 1ab

31 product_media = "product_media" 1ab

32 organization_avatar = "organization_avatar" 1ab

33 

34 

35class File(RecordModel): 1ab

36 __tablename__ = "files" 1ab

37 

38 organization_id: Mapped[UUID] = mapped_column( 1ab

39 Uuid, 

40 ForeignKey("organizations.id", ondelete="cascade"), 

41 nullable=False, 

42 index=True, 

43 ) 

44 

45 @declared_attr 1ab

46 def organization(cls) -> Mapped["Organization"]: 1ab

47 return relationship("Organization", lazy="raise") 1ab

48 

49 name: Mapped[str] = mapped_column(String, nullable=False) 1ab

50 version: Mapped[str | None] = mapped_column(String, nullable=True) 1ab

51 path: Mapped[str] = mapped_column(String, nullable=False) 1ab

52 mime_type: Mapped[str] = mapped_column(String, nullable=False) 1ab

53 size: Mapped[int] = mapped_column(BigInteger, nullable=False) 1ab

54 

55 service: Mapped[FileServiceTypes] = mapped_column(String, nullable=False) 1ab

56 

57 last_modified_at: Mapped[datetime | None] = mapped_column( 1ab

58 TIMESTAMP(timezone=True), 

59 nullable=True, 

60 ) 

61 

62 storage_version: Mapped[str | None] = mapped_column(String, nullable=True) 1ab

63 checksum_etag: Mapped[str | None] = mapped_column(String, nullable=True) 1ab

64 checksum_sha256_base64: Mapped[str | None] = mapped_column(String, nullable=True) 1ab

65 checksum_sha256_hex: Mapped[str | None] = mapped_column(String, nullable=True) 1ab

66 

67 is_uploaded: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) 1ab

68 

69 # Flag for Polar to disable consumption of file 

70 is_enabled: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) 1ab

71 

72 __mapper_args__ = { 1ab

73 "polymorphic_on": "service", 

74 } 

75 

76 

77class DownloadableFile(File): 1ab

78 __mapper_args__ = { 1ab

79 "polymorphic_identity": FileServiceTypes.downloadable, 

80 } 

81 

82 

83class ProductMediaFile(File): 1ab

84 __mapper_args__ = { 1ab

85 "polymorphic_identity": FileServiceTypes.product_media, 

86 } 

87 

88 

89class OrganizationAvatarFile(File): 1ab

90 __mapper_args__ = { 1ab

91 "polymorphic_identity": FileServiceTypes.organization_avatar, 

92 }