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
« 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
5from sqlalchemy import ForeignKey, Numeric, UniqueConstraint, Uuid
6from sqlalchemy.orm import Mapped, declared_attr, mapped_column, relationship
7from sqlalchemy.sql.sqltypes import Integer
9from polar.kit.db.models.base import RecordModel
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
16class SubscriptionMeter(RecordModel):
17 __tablename__ = "subscription_meters"
18 __table_args__ = (UniqueConstraint("subscription_id", "meter_id"),)
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)
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 )
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 )
40 @declared_attr
41 def meter(cls) -> Mapped["Meter"]:
42 return relationship("Meter", lazy="raise_on_sql")
44 def reset(self) -> None:
45 self.consumed_units = Decimal(0)
46 self.credited_units = 0
47 self.amount = 0