Coverage for polar/models/subscription_meter.py: 80%

28 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-07 12:42 +0000

1from decimal import Decimal 

2from typing import TYPE_CHECKING 

3from uuid import UUID 

4 

5from sqlalchemy import ForeignKey, Numeric, UniqueConstraint, Uuid 

6from sqlalchemy.orm import Mapped, declared_attr, mapped_column, relationship 

7from sqlalchemy.sql.sqltypes import Integer 

8 

9from polar.kit.db.models.base import RecordModel 

10 

11if TYPE_CHECKING: 11 ↛ 12line 11 didn't jump to line 12 because the condition on line 11 was never true

12 from .meter import Meter 

13 from .subscription import Subscription 

14 

15 

16class SubscriptionMeter(RecordModel): 

17 __tablename__ = "subscription_meters" 

18 __table_args__ = (UniqueConstraint("subscription_id", "meter_id"),) 

19 

20 consumed_units: Mapped[Decimal] = mapped_column(Numeric, nullable=False, default=0) 

21 credited_units: Mapped[int] = mapped_column(Integer, nullable=False, default=0) 

22 amount: Mapped[int] = mapped_column(Integer, nullable=False, default=0) 

23 

24 subscription_id: Mapped[UUID] = mapped_column( 

25 Uuid, ForeignKey("subscriptions.id", ondelete="cascade"), nullable=False 

26 ) 

27 meter_id: Mapped[UUID] = mapped_column( 

28 Uuid, ForeignKey("meters.id", ondelete="cascade"), nullable=False 

29 ) 

30 

31 @declared_attr 

32 def subscription(cls) -> Mapped["Subscription"]: 

33 return relationship( 

34 "Subscription", 

35 lazy="raise_on_sql", 

36 back_populates="meters", 

37 # cascade="all, delete-orphan", 

38 ) 

39 

40 @declared_attr 

41 def meter(cls) -> Mapped["Meter"]: 

42 return relationship("Meter", lazy="raise_on_sql") 

43 

44 def reset(self) -> None: 

45 self.consumed_units = Decimal(0) 

46 self.credited_units = 0 

47 self.amount = 0