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

1import enum 

2 

3from sqlalchemy import BigInteger, Column, DateTime, Enum, Float, ForeignKey, Integer, String, func 

4from sqlalchemy.orm import relationship 

5 

6from couchers.models import Base 

7 

8 

9class DonationType(enum.Enum): 

10 one_time = enum.auto() 

11 recurring = enum.auto() 

12 

13 

14class DonationInitiation(Base): 

15 """ 

16 Whenever someone initiates a donation through the platform 

17 """ 

18 

19 __tablename__ = "donation_initiations" 

20 id = Column(BigInteger, primary_key=True) 

21 

22 created = Column(DateTime(timezone=True), nullable=False, server_default=func.now()) 

23 user_id = Column(ForeignKey("users.id"), nullable=False, index=True) 

24 

25 amount = Column(Integer, nullable=False) 

26 stripe_checkout_session_id = Column(String, nullable=False) 

27 

28 donation_type = Column(Enum(DonationType), nullable=False) 

29 source = Column(String, nullable=True) 

30 

31 user = relationship("User", backref="donation_initiations") 

32 

33 

34class Invoice(Base): 

35 """ 

36 Successful donations, both one-off and recurring 

37 

38 Triggered by `payment_intent.succeeded` webhook 

39 """ 

40 

41 __tablename__ = "invoices" 

42 

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) 

46 

47 amount = Column(Float, nullable=False) 

48 

49 stripe_payment_intent_id = Column(String, nullable=False, unique=True) 

50 stripe_receipt_url = Column(String, nullable=False) 

51 

52 user = relationship("User", backref="invoices")