Coverage for src/couchers/models/donations.py: 100%
26 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-11-08 00:20 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2025-11-08 00:20 +0000
1import enum
3from sqlalchemy import BigInteger, Column, DateTime, Enum, Float, ForeignKey, Integer, String, func
4from sqlalchemy.orm import relationship
6from couchers.models import Base
9class DonationType(enum.Enum):
10 one_time = enum.auto()
11 recurring = enum.auto()
14class DonationInitiation(Base):
15 """
16 Whenever someone initiates a donation through the platform
17 """
19 __tablename__ = "donation_initiations"
20 id = Column(BigInteger, primary_key=True)
22 created = Column(DateTime(timezone=True), nullable=False, server_default=func.now())
23 user_id = Column(ForeignKey("users.id"), nullable=False, index=True)
25 amount = Column(Integer, nullable=False)
26 stripe_checkout_session_id = Column(String, nullable=False)
28 donation_type = Column(Enum(DonationType), nullable=False)
29 source = Column(String, nullable=True)
31 user = relationship("User", backref="donation_initiations")
34class Invoice(Base):
35 """
36 Successful donations, both one-off and recurring
38 Triggered by `payment_intent.succeeded` webhook
39 """
41 __tablename__ = "invoices"
43 id = Column(BigInteger, primary_key=True)
44 created = Column(DateTime(timezone=True), nullable=False, server_default=func.now())
45 user_id = Column(ForeignKey("users.id"), nullable=False)
47 amount = Column(Float, nullable=False)
49 stripe_payment_intent_id = Column(String, nullable=False, unique=True)
50 stripe_receipt_url = Column(String, nullable=False)
52 user = relationship("User", backref="invoices")