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
« 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
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)
21from polar.kit.db.models import RecordModel 1ab
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 )
29class FileServiceTypes(StrEnum): 1ab
30 downloadable = "downloadable" 1ab
31 product_media = "product_media" 1ab
32 organization_avatar = "organization_avatar" 1ab
35class File(RecordModel): 1ab
36 __tablename__ = "files" 1ab
38 organization_id: Mapped[UUID] = mapped_column( 1ab
39 Uuid,
40 ForeignKey("organizations.id", ondelete="cascade"),
41 nullable=False,
42 index=True,
43 )
45 @declared_attr 1ab
46 def organization(cls) -> Mapped["Organization"]: 1ab
47 return relationship("Organization", lazy="raise") 1ab
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
55 service: Mapped[FileServiceTypes] = mapped_column(String, nullable=False) 1ab
57 last_modified_at: Mapped[datetime | None] = mapped_column( 1ab
58 TIMESTAMP(timezone=True),
59 nullable=True,
60 )
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
67 is_uploaded: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) 1ab
69 # Flag for Polar to disable consumption of file
70 is_enabled: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) 1ab
72 __mapper_args__ = { 1ab
73 "polymorphic_on": "service",
74 }
77class DownloadableFile(File): 1ab
78 __mapper_args__ = { 1ab
79 "polymorphic_identity": FileServiceTypes.downloadable,
80 }
83class ProductMediaFile(File): 1ab
84 __mapper_args__ = { 1ab
85 "polymorphic_identity": FileServiceTypes.product_media,
86 }
89class OrganizationAvatarFile(File): 1ab
90 __mapper_args__ = { 1ab
91 "polymorphic_identity": FileServiceTypes.organization_avatar,
92 }